У меня есть три таблицы.
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
кажется, не работает правильно. Советуйте, спасибо за внимание :)
Лучше будет хранить теги дополнительно в строке прямо в таблице постов, чтобы избежать дополнительных объединений и группировок. Просто как денормализация производительности.
Вам нужно добавить предложение 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
выше, чтобы объединить теги в указанном вами порядке.