我有博客文章的标记字段。标签具有唯一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
答案 0 :(得分:66)
试试这个:
GROUP_CONCAT(
DISTINCT CONCAT(tags.id,',',tags.displayName)
ORDER BY posts.id
SEPARATOR ';'
)
答案 1 :(得分:1)
根据@Willa的建议,我将评论添加为anwser:
GROUP_CONCAT允许您合并多个字段:
GROUP_CONCAT(tags.id, ',', tags.displayName)
与Stephan答案的唯一区别是,如果您的代码允许同一标签多次影响一个帖子,或者如果您的JOIN序列导致您在标签表中多次选择同一条记录,则与Stephan的回答唯一不同。在这种情况下,我的解决方案将多次返回相同的标签。