【问题标题】:Enumerating combinations via SQL通过 SQL 枚举组合
【发布时间】:2012-02-10 07:19:44
【问题描述】:

我有一张这样的桌子:

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。

感谢您的所有意见!

【问题讨论】:

  • 你的桌子是怎么做的?我的意思是它看起来真的很好。你手动做的吗?

标签: mysql sql database


【解决方案1】:

从您的示例来看,您似乎希望第一列包含任何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.

【讨论】:

    【解决方案2】:

    您的第一步是获取组合列表。

    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
    

    下一步是计算 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多