Как выбрать все теги для сообщения с данным тегом в MySQL? - PullRequest
1 голос
/ 27 сентября 2011

Предположим, у меня есть три таблицы: posts, tags и posts_tags. В сообщениях хранятся все сообщения в моем блоге, в тегах хранятся все различные теги, а в posts_tags хранятся отношения между ними. Например, если запись с идентификатором 2 помечена тегом с идентификатором 3, posts_tags сохранит это отношение.

Я хочу составить запрос, в котором я могу получить все сообщения, помеченные данным идентификатором, и другие теги, связанные с этими сообщениями. Например, я хочу, чтобы в одном запросе можно было найти все сообщения, отмеченные тегом «программирование», и все другие теги, связанные с этим сообщением.

В настоящее время я использую два запроса: один, чтобы найти сообщения, помеченные данным тегом, и один, чтобы найти все теги для этих сообщений.

Есть ли способ объединить эти запросы в один запрос?

Ответы [ 2 ]

4 голосов
/ 27 сентября 2011

Этот запрос вернет все записи, имеющие тег: search_tag и список второго столбца, в строке с разделителями-запятыми, все другие теги (не включая искомую), которые относятся к этомусообщение.Если сообщение содержит только запрошенный вами тег, он появится в списке, но столбец "дополнительные_ теги" будет иметь значение ПУСТО (NULL).

 SELECT posts.id, GROUP_CONCAT(post_tags.tag) AS additional_tags
   FROM posts LEFT OUTER JOIN post_tags ON posts.id = post_tags.post_id
   WHERE posts.id IN (SELECT post_id FROM post_tags WHERE tag = :search_tag)
   AND post_tags.tag <> :search_tag
   GROUP BY posts.id
0 голосов
/ 27 сентября 2011

Предположим, ваш идентификатор "программирования" равен 1, и вы хотите получить все сообщения с идентификатором тега 1

Select * from posts where tag_id in (select id from tag where id=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...