通过SQL枚举组合

时间:2012-02-09 23:04:00

标签: mysql sql database

我有一张这样的表:

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将是首选。

感谢所有输入!

2 个答案:

答案 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

And here's the query in action to prove I'm not crazy.

答案 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