MySQL - 带连接的GROUP_CONCAT

时间:2012-08-12 06:12:37

标签: mysql

我的问题与MySQL: is it possible to group_concat multiple rows?非常相似,但我无法理解小组联合的工作方式。

我的实际数据集很难解释 - 我将使用一组简化的表和关系作为示例。

说我有一张桌子photos

id  filename
1   bob.jpg
2.  ken.png
3.  lisa.jpg
4.  jim.jpg
...

和表tags

id  title
1   family
2   friends
3   school
4   california
...

和一个名为photo_tags

的桥梁
photo  tag
1      2
1      3
1      4
2      1
3      1

我想回到这样的行:

photo_id  filename   tags
1         bob.jpg    2,3,4
2         ken.png    1
3         lisa.jpg   1
4         jim.jpg    (NULL)

...或

photo_id  filename   tags
1         bob.jpg    friends,school,california
2         ken.png    family
3         lisa.jpg   family
4         jim.jpg    (NULL)

我最初的猜测是这样的:

SELECT photos.filename,
GROUP_CONCAT(photo_tags.tag) AS associated_tags
FROM photos
LEFT OUTER JOIN tags
ON tags.photo = photos.id
GROUP BY photo_tags.tag

但是(对于那些知道自己在做什么的人来说可能很明显),这是行不通的。在做了一些研究并参考上面的链接之后,我尝试了各种各样的排列:

SELECT 
  file_name,
  GROUP_CONCAT(photo_tag_ids) AS associated_tags
FROM (
  SELECT 
    photos.filename AS file_name,
    photo_tags.tag AS photo_tag_ids
  FROM  
    photos
    INNER JOIN photo_tags
         ON photo_tags.photo= photos.id
) whatever
GROUP BY file_name
ORDER BY file_name;

TYIA。

1 个答案:

答案 0 :(得分:4)

SELECT photos.filename,
       GROUP_CONCAT(photo_tags.tag) AS associated_tags
FROM photos
LEFT OUTER JOIN tags ON tags.photo = photos.id
GROUP BY photos.filename

您必须按每个行唯一的列进行分组,并且在组中您可以构建其他列的group_concat。因此,将group by更改为photos.filename

相关问题