MySQL查询多对多关系表

时间:2019-07-31 15:20:42

标签: mysql sql

我在这里遇到一些问题,需要帮助。

我有一个名为 posts 的表,另一个名为 tags 的表,它们之间的多对多关系称为 item_tags

这是结构:

帖子

  • id
  • 标题
  • 说明

标签

  • id
  • 名称
  • seo

item_tags

  • id
  • post_id
  • tag_id

所以,现在让我们说,我想通过已经具有其tag_id来构建一个查询以匹配多个标签。例如,让我们尝试匹配所有具有tag_id 11,tag_id 133和tag_id 182的帖子。我能做的是使用OR运算符选择它们,但这些并不是我想要的结果,因为我想要匹配所有具有全部的所有帖子提到的标签不仅包含一些标签...

我的查询是:

SELECT * FROM item_tags中的tag_id = '11'或tag_id ='133'或tag_id ='182'

错了...

以下是表格的屏幕截图:https://i.imgur.com/X60HIM5.png

PS:我想基于多个关键字(标签)进行搜索。

谢谢!

3 个答案:

答案 0 :(得分:0)

如果您希望所有带有 all 标记的帖子,则可以使用:

select p.*
from posts p
where exists (select 1 from item_tags a where a.post_id = p.id and a.tag_id = 11)
  and exists (select 1 from item_tags a where a.post_id = p.id and a.tag_id = 133)
  and exists (select 1 from item_tags a where a.post_id = p.id and a.tag_id = 182)

如果您想要用这三个标签中的任何标签的帖子,请使用:

select p.*
from posts p
where exists (select 1 from item_tags a where a.post_id = p.id and a.tag_id = 11)
   or exists (select 1 from item_tags a where a.post_id = p.id and a.tag_id = 133)
   or exists (select 1 from item_tags a where a.post_id = p.id and a.tag_id = 182)

答案 1 :(得分:0)

重要提示:我尚未测试!

SELECT * FROM posts WHERE id IN(SELECT post_id FROM item_tags WHERE item_tags.tag_id='11' OR item_tags.tag_id='133' OR item_tags.tag_id='182');

答案 2 :(得分:0)

您可以按post_id对结果进行分组,然后仅保存链接了所有标签的标签

select * 
from posts 
where id in (
    select post_id 
    from item_tags 
    where tag_id in (11,133,182) 
    group by post_id 
    having count(tag_id)=3
)