我有三张桌子。
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
似乎无法正常工作。请指教,谢谢你的时间:)
答案 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表中的字符串中,以防止其他连接和分组。就像性能非规范化一样。