我现在试图解决这个难题超过几个小时,表格如下:
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中的重复应删除。
答案 0 :(得分:1)
以下使用用户变量来模拟行号分析,以将行号分配给列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;如果它没有修改就行了,我实际上有点惊讶。