MySQL Query用于检索已过滤的分组列的所有值

时间:2014-04-22 19:12:50

标签: mysql sql group-by group-concat

说我有以下定义的表:

Table `content`:
===============
id unsigned int(11)
title varchar(500)

Table `satellite`:
===============
id unsigned int(11)
label varchar(250)

Table `content_satellite`:
===============
content_id unsigned int(11)
satellite_id unsigned int(11)

如果我想获得一个内容行列表,其中包含相关卫星的GROUP_CONCAT()'ted列表,特定卫星类型的FILTERED,查询将是什么?

使用以下查询:

SELECT 
c.title,
GROUP_CONCAT(s.id) as satellite_ids
FROM content c
LEFT JOIN content_satellite cs ON cs.content_id = c.id
LEFT JOIN satellite s ON cs.satellite_id = s.id
WHERE satellite = 2
GROUP BY c.id;

无论特定内容行是否与多个卫星类型相关联,结果行的satellite_ids只包含单个值“2”...

如何查询这些表以检索包含与过滤特定卫星类型时返回的每个内容行关联的所有卫星ID的列?

编辑 - MySQL 5.5是数据库类型(没有意识到这对于像这样的常见基本SQL查询很重要)

EDIT2 - 离开我的SQL查询

1 个答案:

答案 0 :(得分:2)

您的查询会连接所有ID并为您提供随机标题。当然,当您只选择卫星ID#2时,您只能看到#2。

首先,您不想聚合所有记录。你想要团体。您希望每个内容有一条记录,因此请按内容分组。由于可能存在重复的标题,因此可以更好地按内容ID分组。

SELECT 
  c.id,
  c.title,
  GROUP_CONCAT(distinct cs.satellite_id order by cs.satellite_id) as satellite_ids
FROM content c
LEFT JOIN content_satellite cs ON cs.content_id = c.id
GROUP BY c.id;

编辑:要获取其列表中包含#2卫星的内容,请使用具有适当案例表达式的HAVING:

SELECT 
  c.id,
  c.title,
  GROUP_CONCAT(distinct cs.satellite_id order by cs.satellite_id) as satellite_ids
FROM content c
LEFT JOIN content_satellite cs ON cs.content_id = c.id
GROUP BY c.id
HAVING MAX( CASE WHEN cs.satellite_id = 2 THEN 1 ELSE 0 END ) = 1;