我有一张这样的表:
ID | name
=================================
1 | apple
1 | bear
2 | cactus
2 | dog
2 | apple
3 | apple
3 | dog
==================================
我希望每个ID获得以下唯一的一组组合作为SQL查询的输出:
===================
apple | bear
apple | cactus
apple | dog
cactus | dog
===================
它本质上是一种转置。理想情况下,我想扩大这个范围以包括共同发生的数量,如下:
===================
1 | apple | bear
1 | apple | cactus
2 | apple | dog
1 | cactus | dog
===================
但这可能超越了。我知道我可以使用存储过程完成上述所有操作;如果我可以将此作为查询,我只是好奇。
任何SQL都可以,但如果可能的话,MySQL将是首选。
感谢所有输入!
答案 0 :(得分:2)
从您的示例中,您希望第一列包含按字母顺序排列的name
,因此我在将表连接到自身时使用了<
。
select count(*), t1.Name, t2.Name
from
tblThings t1 join
tblThings t2 ON t1.ID = t2.ID AND t1.Name < t2.Name
group by t1.Name, t2.Name
答案 1 :(得分:0)
您的第一步是获取组合列表。
SELECT * FROM names n1
INNER JOIN names n2 ON n1.id = n2.id
WHERE n1.name < n2.name;
这将产生
1|apple|1|bear
2|cactus|2|dog
2|apple|2|cactus
2|apple|2|dog
3|apple|3|dog
下一步是COUNT name1,name2的唯一组合。
SELECT COUNT(1), name1, name2
FROM (
SELECT n1.name AS name1, n2.name AS name2
FROM names n1 INNER JOIN names n2 ON n1.id = n2.id
WHERE n1.name < n2.name) x
GROUP BY name1, name2
哪个收益
1|apple|bear
1|apple|cactus
2|apple|dog
1|cactus|dog