结合MySQL表,也显示何时找不到其他表

时间:2015-07-13 14:33:07

标签: mysql sql

我想知道纯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  | ...
+----+---------+--------------+---

如何才能显示没有标签的帖子?

2 个答案:

答案 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