我在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 :(得分: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 :(得分: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
答案 2 :(得分:-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