按标签搜索,包含

时间:2014-12-11 21:29:29

标签: mysql sql

我在storiestags之间存在多对多关系,为保持关系而创建的表格为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

3 个答案:

答案 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