SQL-запрос: получить теги, связанные с постом - PullRequest
5 голосов
/ 15 февраля 2010

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

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 ]

11 голосов
/ 15 февраля 2010

Вам необходимо добавить предложение 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 голос
/ 15 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...