我想知道纯mysql查询是否能够执行以下操作:
这是我的标记表:
+---------+-----+
| post_id | tag |
+---------+-----+
| 3 | lol |
| 3 | fun |
| 3 | hot |
+---------+-----+
这些标签属于此表,其中包含帖子:
+----+---------+---
| id | message | ...
+----+---------+---
| 1 | hello.. | ...
| 3 | nice.. | ...
+----+---------+---
现在我想要的是标签表与帖子表相结合,并且标签是每个帖子在单独的列中称为标签,其中所有标签位于一个逗号分隔它们:
+----+---------+--------------+---
| id | message | tags | ...
+----+---------+--------------+---
| 1 | hello.. | | ...
| 3 | nice.. | lol,fun,hot | ...
+----+---------+--------------+---
我现在使用此查询,部分工作:
SELECT ri_posts.*, GROUP_CONCAT(ri_terms.hashtag SEPARATOR ', ') AS hashtags FROM ri_posts JOIN ri_terms ON ri_terms.parent_id = ri_posts.id
此查询的问题在于它仅显示在标记表中具有与同一父ID对应的标记的帖子。 如果帖子没有标签,则不会包含在结果中。
所以现在结果是(注意id为1的帖子已经消失):
+----+---------+--------------+---
| id | message | tags | ...
+----+---------+--------------+---
| 3 | nice.. | lol,fun,hot | ...
+----+---------+--------------+---
如何才能显示没有标签的帖子?
答案 0 :(得分:1)
您需要GROUP BY
获取多行,LEFT JOIN
才能获得所有帖子,即使是那些没有标记的帖子:
SELECT p.*, GROUP_CONCAT(t.hashtag SEPARATOR ', ') AS hashtags
FROM ri_posts p LEFT JOIN
ri_terms t
ON t.parent_id = p.id
GROUP BY p.id;
答案 1 :(得分:0)
使用左连接 -
SELECT ri_posts.*, GROUP_CONCAT(ri_terms.hashtag SEPARATOR ', ') AS hashtags
FROM ri_posts
LEFT JOIN ri_terms ON ri_terms.parent_id = ri_posts.id
GROUP BY re_posts.id