SQL-запрос: получите теги, связанные с сообщением

У меня есть три таблицы.

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

кажется, не работает правильно. Советуйте, спасибо за внимание :)

5
задан axsuul 14 February 2010 в 21:42
поделиться

2 ответа

Лучше будет хранить теги дополнительно в строке прямо в таблице постов, чтобы избежать дополнительных объединений и группировок. Просто как денормализация производительности.

1
ответ дан 13 December 2019 в 05:34
поделиться

Вам нужно добавить предложение 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 выше, чтобы объединить теги в указанном вами порядке.

11
ответ дан 13 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: