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

axs*_*uul 5 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    |
+---------+-----------+
Run Code Online (Sandbox Code Playgroud)

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

post.id    post.title    tags
------------------------------------
1          hello         news,photos
2          goodbye       photos
Run Code Online (Sandbox Code Playgroud)

就像是

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
Run Code Online (Sandbox Code Playgroud)

似乎没有正常工作.请指教,谢谢你的时间:)

Phi*_*oss 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
Run Code Online (Sandbox Code Playgroud)

我还在上面添加了一个命令GROUP_CONCAT,以按照您指定的顺序连接标记.


zer*_*kms 1

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