2014-12-11 5 views
2

У меня есть много-много отношений между stories и tags, таблица создана для хранения отношений taxonomies. Я хочу искать все истории, в которых есть все теги.Поиск по тегу, включительно

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

SELECT stories.* FROM `stories` 
JOIN `taxonomies` ON `stories`.id = `taxonomies`.`story_id` 
JOIN `tags` ON `tags`.id = `taxonomies`.tag_id 
WHERE `tags`.name = 'tag 1' OR `tags`.name = 'tag 2' /* ... */ 
GROUP BY stories.id 
+0

Есть ли какой-либо причине вы используете OR сравнить вместо AND? – ryanyuyu

+0

Как вы хотите получить «истории, содержащие все определенные теги», если некоторые из тегов являются взаимоисключающими? Может быть, есть что-то большее в этой проблеме? – ryanyuyu

ответ

4

Я думаю, что вы хотите этот запрос

SELECT stories.id FROM `stories` 
JOIN `taxonomies` ON `stories`.id = `taxonomies`.`story_id` 
JOIN `tags` ON `tags`.id = `taxonomies`.tag_id 
GROUP BY stories.id 
HAVING SUM(`tags`.name = 'tag 1')>0 
AND SUM(`tags`.name = 'tag 2')>0 
+1

Довольно аккуратное решение, спасибо! TIL. – gosukiwi

+0

@gosukiwi Opps Я ошибся, исправил его. ГДЕ не было необходимости – Mihai

-1

Простейший способ сделать это будет:

SELECT stories.* FROM `stories` 
JOIN `taxonomies` ON `stories`.id = `taxonomies`.`story_id` 
JOIN `tags` ON `tags`.id = `taxonomies`.tag_id 
WHERE `tags`.name = 'tag 1' 
GROUP BY stories.id 
intersect 
SELECT stories.* FROM `stories` 
JOIN `taxonomies` ON `stories`.id = `taxonomies`.`story_id` 
JOIN `tags` ON `tags`.id = `taxonomies`.tag_id 
WHERE `tags`.name = 'tag 2' 
GROUP BY stories.id 
+0

Mysql не пересекается, я полагаю, вы пришли из оракула – Mihai

1

Вы знаете, количество тегов, которые вы проверяете? Если да, можете ли вы использовать HAVING, чтобы подтвердить, что количество совпадений для stories.id соответствует общему количеству тегов? Что-то вроде этого:

SELECT stories.id, COUNT(stories.id) 
FROM `stories` 
JOIN `taxonomies` ON `stories`.id = `taxonomies`.`story_id` 
JOIN `tags` ON `tags`.id = `taxonomies`.tag_id 
WHERE `tags`.name = 'tag 1' OR `tags`.name = 'tag 2' /* ... */ 
GROUP BY stories.id 
HAVING COUNT(stories.id) = @numberOfTags 
+0

Просто убедитесь, что у вас нет повторяющихся тегов. –

Смежные вопросы