加入或分组表以仅删除一列中的重复

时间:2018-02-19 19:48:04

标签: mysql sorting join group-by

我现在试图解决这个难题超过几个小时,表格如下:

table:
n1  n2  r
---------
A   D   G
B   D   G
C   D   G
A   E   G
B   E   G
C   E   G
A   F   G
B   F   G
C   F   G

预期结果:

result:
n1  n2  r
---------
A   D   G   
B   E   G
C   F   G

我正在尝试分组,加入,但不缺。这是代码,但它给了我完全不同的结果:

select * from table t1
    join table t2
    on t2.r = t1.r
    and t1.n1 > t2.n1

一般来说,n1和n2应按r分组,n2中的重复应删除。

2 个答案:

答案 0 :(得分:1)

DEMO on Rextester

以下使用用户变量来模拟行号分析,以将行号分配给列n1和n2中的每个唯一值。除了break-all之外,此值还用于连接两个集合Der_N1和Der_N2,以便我们可以生成将N1中的每个值与N2中的每个值相对应的结果集,从而确保每个值仅对{的每个值使用一次{1}}

R

导致:

R.

假设最低值N1(x)应该与最低值N2(y)配对,而下一个最低x(x + 1)应该与下一个最低N2(y + 1)按升序配对并且等...... ..

通过在连接中包含R;我相信我们会处理每一套,不需要分组。

答案 1 :(得分:0)

我对它们不太熟悉;并且不确定MySQL实际引入了哪个版本,但我相信你需要一个递归的“CTE”(公用表表达式)。类似的东西:

WITH RECURSIVE cte (n1, n2, r) AS
(
  SELECT n1, n2, r FROM theTable ORDER BY n1, n2 ASC LIMIT 1
  UNION ALL
  SELECT n1, n2, r 
  FROM theTable AS t
  WHERE NOT EXISTS (
       SELECT 1 
       FROM cte AS c 
       WHERE c.n1 IN (t.n1, t.n2) OR c.n2 IN (t.n1, t.n2)
       )
  ORDER BY n1, n2 ASC 
  LIMIT 1
)
SELECT * FROM cte;

你可能需要在第二部分搞乱LIMIT;如果它没有修改就行了,我实际上有点惊讶。