【问题标题】:problems using GROUP_CONCAT in MYSQL在 MYSQL 中使用 GROUP_CONCAT 的问题
【发布时间】:2013-06-06 06:41:23
【问题描述】:

我有以下表格:

帖子:id、标题、日期、内容

标签:id、名称

posts_tags:post_id、tag_id

我想选择带有相关标签列表的标题;以下查询效果很好

SELECT p.title, GROUP_CONCAT( t.name ORDER BY t.name SEPARATOR ',' ) as tags_list
FROM posts AS p
JOIN posts_tags AS pt ON pt.post_id = p.id
JOIN tags AS t ON pt.tag_id = t.id
GROUP BY p.id

通过这个查询,我得到了一些看起来像这样的东西

title             |  tags_list
==================|===============================
Old cinema        |  film,movies
cooking shows     |  cooking,food,kitchen,television
Epic War Films    |  history,movies,war
Art in France     |  art,france,history

当我只想发布带有特定标签的帖子(例如“电影”)时,我尝试添加 where 子句:

SELECT p.title, GROUP_CONCAT( t.name ORDER BY t.name SEPARATOR ',' ) as tags_list
FROM posts AS p
JOIN posts_tags AS pt ON pt.post_id = p.id
JOIN tags AS t ON pt.tag_id = t.id
WHERE t.name = 'movies'
GROUP BY p.id

我最终得到了这个

title            |  tags_list
=================|===============================
Old cinema       |  movies
Epic War Films   |  movies

我得到了所有标记为“电影”的帖子,但问题是“tags_list”列仅在每一行中显示“电影”,而不包括与帖子关联的所有其他标签。

我该如何解决这个问题?

【问题讨论】:

标签: mysql group-concat


【解决方案1】:

条件需要放在GROUP_CONCAT 的结果上而不是每一行上,所以@AshwinMukhija 建议条件需要放在HAVING 子句中:

SELECT 
    p.title, 
    GROUP_CONCAT( t.name ORDER BY t.name SEPARATOR ',' ) as tags_list
FROM 
    posts AS p
JOIN posts_tags AS pt 
    ON pt.post_id = p.id
JOIN tags AS t 
    ON pt.tag_id = t.id
GROUP BY 
    p.id
HAVING
    FIND_IN_SET('movies',tags_list)

如果在逗号分隔列表tags_list中找到字符串movies,FIND_IN_SET返回true

【讨论】:

  • 感谢斯蒂芬,效果很好。我认为 Ashwin 对“拥有”的想法是正确的,但是将拥有与 FIND_IN_SET 一起使用对我来说很有效。
【解决方案2】:

您只需将标签上的条件从where 子句转换为having

SELECT p.title, GROUP_CONCAT( t.name ORDER BY t.name SEPARATOR ',' ) as tags_list
FROM posts AS p
JOIN posts_tags AS pt ON pt.post_id = p.id
JOIN tags AS t ON pt.tag_id = t.id
GROUP BY p.id
HAVING t.name = 'movies'

【讨论】:

  • 嗨 Ashwin,当我使用此查询时出现错误:#1054 - Unknown column 't.name' in 'having clause'
猜你喜欢
  • 2014-01-25
  • 1970-01-01
  • 2010-10-06
  • 2018-12-12
  • 2021-01-30
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多