【问题标题】:mysql GROUP_CONCAT DISTINCT multiple columnsmysql GROUP_CONCAT DISTINCT 多列
【发布时间】:2013-09-21 14:46:15
【问题描述】:

我有一个博客帖子的标签字段。标签具有唯一 ID,但其 displayName 可能重复。我想要的是一个选择帖子的查询,在all_tags 字段中,我们得到一对 (id,displayName) 是这样的:

id1,name1;id2,name2;id3,name3

我的查询如下:

select ....
CONCAT_WS(';', DISTINCT (CONCAT_WS(',',tags.id,tags.displayName))) AS all_tags
Join ...post content ...
Join ...post_tags ...
Join ...tags ...
ORDER BY posts.id

这行导致问题:

CONCAT_WS(';', DISTINCT (CONCAT_WS(',',tags.id,tags.displayName))) AS all_tags

我应该如何修改它?

有些人使用内部(SELECT .. FROM),但正如我听说的那样,效率很低


SELECT `posts`.*,`categories`.*,`creators`.*,`editors`.*
CONCAT_WS(';', DISTINCT GROUP_CONCAT(CONCAT_WS(',',tags.id,tags.displayName))) AS all_ids
FROM (`posts`) 
LEFT JOIN `languages` ON `posts`.`language_id`=`languages`.`id` 
LEFT JOIN `users` as creators ON `posts`.`creatorUser_id`=`creators`.`id` 
LEFT JOIN `users` as editors ON `posts`.`lastEditorUser_id`=`editors`.`id` 
LEFT JOIN `userProfiles` as editors_profile ON `editors`.`profile_id`=`editors_profile`.`id` 
LEFT JOIN `categories` ON `posts`.`category_id`=`categories`.`id` 
LEFT JOIN `postTags` ON `postTags`.`post_id`=`posts`.`id` 
LEFT JOIN `tags` ON `postTags`.`tag_id`=`tags`.`id` 
LEFT JOIN `postTags` as `nodetag_checks` ON `nodetag_checks`.`post_id`=`posts`.`id` 
LEFT JOIN `tags` as `tag_checks` ON `nodetag_checks`.`tag_id`=`tag_checks`.`id` 
WHERE ( 9 IN(`tag_checks`.`id`,`tag_checks`.`cached_parents`) OR 10 IN(`tag_checks`.`id`,`tag_checks`.`cached_parents`) OR 11 IN(`tag_checks`.`id`,`tag_checks`.`cached_parents`)) 
GROUP BY `posts`.`id` ORDER BY `posts`.`created` desc LIMIT 0, 20  

【问题讨论】:

标签: mysql tags


【解决方案1】:

试试这个:

GROUP_CONCAT(
  DISTINCT CONCAT(tags.id,',',tags.displayName) 
  ORDER BY posts.id 
  SEPARATOR ';'
)

【讨论】:

  • 您的意思很可能是CONCAT(tags.id, ',', tags.displayName)。还有GROUP BY post.id 而不是ORDER BY post.id 是有序的。
  • @peterm 实际上不,操作想要返回一个字符串,如 "id1,name1;id2,name2;id3,name3..."
  • GROUP_CONCAT(DISTINCT CONCAT(tags.id,',',tags.displayName) ORDER BY posts.id SEPARATOR ';')
  • @Stephan 请问为什么这里需要ORDER BY
  • 请注意,如果不需要 DISTINCT,则不需要 CONCAT,因为 GROUP_CONCAT 能够连接多个字段:GROUP_CONCAT(tags.id, ',', tags.displayName)
【解决方案2】:

按照@Willa 的建议,我将我的评论添加为anwser:

GROUP_CONCAT 允许您连接多个字段:

GROUP_CONCAT(tags.id, ',', tags.displayName)

与斯蒂芬的答案的唯一区别是,如果您的代码允许同一标签多次影响到一个帖子,或者如果您的 JOIN 序列导致您在标签表中多选同一记录。在这种情况下,我的解决方案将多次返回相同的标签。

【讨论】:

    猜你喜欢
    • 2011-03-06
    • 2013-04-12
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 2016-08-29
    相关资源
    最近更新 更多