Я пишу веб-приложение, похожее на программное обеспечение для ведения блога. Есть три таблицы, как показано ниже
Posts Table: Post_id,Post_Text Post_Tags Table: Post_id,Tag_id Tags Table:Tag_id,Tag_name
У меня есть трудности в концептуализации SQL-запроса, который будет возвращать сообщения, которые имеют «все теги» в заданном наборе.
Это реляционное деление .
Используйте GROUP BY
и COUNT
или double NOT EXISTS
.
Примером первого подхода будет.
SELECT pt.Post_id, p.Post_Text FROM Post_Tags pt JOIN Posts p ON p.Post_id = pt.Post_id WHERE pt.Tag_id IN (1,2,3) GROUP BY pt.Post_id HAVING COUNT(DISTINCT pt.Tag_id) = 3
Попробуй это:
select * from posts where post_id in (select post_id from post_tags pt join tags t on pt.tag_id = t.tag_id where tag_name = @yourtaghere)
или…
select p.* from posts p join post_tags pt on p.post_id = pt.post_id join tags t on t.tag_id = pt.tag_id where t.tag_name = @yourtaghere
Если у вас несколько тэгов, которые вы пытаетесь сопоставить, замените имя_таблицы = @youtagehere с именем tag_ в ('tag1', 'tag2', 'tag3' и т. Д.).