SQL查询:获取与post关联的标签

时间:2010-02-14 21:42:09

标签: mysql tags

我有三张桌子。

posts
| id      | title     |
+---------+-----------+
| 1       | hello     |
| 2       | goodbye   |
+---------+-----------+

posts_tags
| tag_id  | post_id   |
+---------+-----------+
| 1       | 1         |
| 2       | 1         |
| 2       | 2         |
+---------+-----------+

tags
| id      | name      |
+---------+-----------+
| 1       | news      |
| 2       | photos    |
+---------+-----------+

我希望能够选择帖子,但结果是

post.id    post.title    tags
------------------------------------
1          hello         news,photos
2          goodbye       photos

这样的东西
SELECT *,
       GROUP_CONCAT(tags.name) AS tags
FROM posts
    LEFT JOIN posts_tags
        ON posts.id = posts_tags.post_id
    LEFT JOIN tags
        ON posts_tags.tag_id = tags.id

似乎无法正常工作。请指教,谢谢你的时间:)

2 个答案:

答案 0 :(得分:11)

您需要在查询中添加GROUP BY子句:

SELECT posts.*,
       GROUP_CONCAT(tags.name ORDER BY tags.name) AS tags
FROM posts
    LEFT JOIN posts_tags
        ON posts.id = posts_tags.post_id
    LEFT JOIN tags
        ON posts_tags.tag_id = tags.id
GROUP BY posts.id

我还在上面GROUP_CONCAT添加了一个订单,以便按照您指定的顺序连接标记。

答案 1 :(得分:1)

更好的方法是将标签另外存储在posts表中的字符串中,以防止其他连接和分组。就像性能非规范化一样。