假设我有dogs(dogid)
表和fleas(fleaid)
表以及另一个dogs_favorite_fleas(dogid,fleaid)
一只狗可以在 dog_favorite_fleas
中列出他最喜欢的跳蚤。我怎样才能创建一个查询/临时表列出所有独特的跳蚤集并计算它们?例如,假设 Rex
喜欢 fleaa
和 fleab
,而 Spot
喜欢 'fleaaand
flea c,
Lassie喜欢
flea b和
flea a`。查询结果应该是:
fleas |count
-------------------------
flea a, flea b |2
flea a, flea c |1
注意:大约有 5000 种不同的跳蚤和大约 450 万只狗。
进行此查询的最佳方式是什么?
最佳答案
使用GROUP_CONCAT
使用 GROUP BY
:
SELECT GROUP_CONCAT(f.flea SEPARATOR ', ') AS 'fleas', COUNT(df.dogid) 'Count'
FROM dogs_favorite_fleas df
INNER JOIN fleas f ON df.fleaid = f.id
INNER JOIN dogs d ON df.dogid = d.id
GROUP BY df.dogid
SQL Fiddle Demo
更新:如果您想计算有多少个分组的跳蚤列表,请将上一个查询包含在子查询中并使用 GROUP BY
和 COUNT
像这样:
SELECT fleas, COUNT(fleas) 'COUNT'
FROM
(
SELECT GROUP_CONCAT(f.flea SEPARATOR ', ') AS 'fleas'
FROM dogs_favorite_fleas df
INNER JOIN fleas f ON df.fleaid = f.id
INNER JOIN dogs d ON df.dogid = d.id
GROUP BY df.dogid
ORDER BY f.flea
) t
GROUP BY fleas
Updated SQL Fiddle Demo
关于mysql - 如何在 SQL 中实现类似集合的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12821031/