mysql - 如何在 SQL 中实现类似集合的行为?

标签 mysql sql group-concat

假设我有dogs(dogid) 表和fleas(fleaid) 表以及另一个dogs_favorite_fleas(dogid,fleaid) 一只狗可以在 dog_favorite_fleas 中列出他最喜欢的跳蚤。我怎样才能创建一个查询/临时表列出所有独特的跳蚤集并计算它们?例如,假设 Rex 喜欢 fleaafleab,而 Spot 喜欢 'fleaaand flea cLassie喜欢flea bflea 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 BYCOUNT像这样:

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/

相关文章:

mysql - rake 时出现段错误(Ruby on Rails)

mysql - 如果在重复键更新时插入

mysql - 更改外键表名称未正确更新数据

php - group_concat过滤结果,内连接查询

php - Mysql 加入 1 行与多行 - 组 concat 或 php?

php - 将所有数据库表放入数组的函数

php - 太多的连接被用于在 mysql 中插入数据

mysql - Yii2 中的 findBySql 未返回预期结果集

sql - mysql连接创建缺失日期的表

MySQL 查询 SELECT 多行