MySQL GROUP_CONCAT()将所有行分组

7

我有以下查询:

select card.id as id, photo.image as photo
from card
left outer join card_image as photo on (photo.card=card.id)

返回的是
+----+-------+
| id | photo |
+----+-------+
|  1 |     2 |
|  1 |     3 |
|  1 |     4 |
|  2 |     5 |
|  2 |     6 |
+----+-------+

如果我将photo.image as photo更改为group_concat(photo.image) as photos,则会得到以下结果。
+----+---------------+
| id | photo         |
+----+---------------+
|  1 |     2,3,4,5,6 |
+----+---------------+

但是我的期望是:
+----+-----------+
| id | photo     |
+----+-----------+
|  1 |     2,3,4 |
|  2 |     5,6   |
+----+-----------+

我想通过id获取每张卡片的一组照片。
2个回答

7

GROUP_CONCAT()是一种聚合函数,类似于MAX()。它为每个分组生成一行。分组由GROUP BY子句定义,在缺少这样的子句时——就像在您的情况下一样——所有行都属于同一组。您可能想按card.id进行分组:

select
  card.id as id,
  group_concat(photo.image) as photos
from
  card
  left outer join card_image as photo
    on (photo.card = card.id)
group by card.id

请注意,在聚合查询中,标准SQL只允许选择分组列和各组函数。在您的原始示例中没有分组列,因此您依赖于MySQL扩展才能选择card.id。另一方面,我上面提供的代码在这方面是标准的(但group_concat()仍然是MySQL的特色)。

2

您应该在查询中使用GROUP BY,以便:

select card.id as id, group_concat(photo.image) as photos
from card
left outer join card_image as photo on (photo.card=card.id)
GROUP BY id 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接