SQL查询 - 加入先前连接的所有行

时间:2013-10-15 02:56:57

标签: mysql sql join

我有3张桌子:

  
      
  1. 页面(id,name,desc)
  2.   
  3. page_tags(id,page_id,tag_id)
  4.   
  5. tag_posts(tag_id,post_id)
  6.   

如果页面表中有一个页面,我想获取tag_posts表中的帖子,其中tag_id匹配 ALL page_tags表中给定页面的tag_ids。

例如,如果3个表中的条目是:

1)页面:

  
      
  1. [1,'第1页','有些desc']
  2.   

2)page_tags:

  
      
  1. [1,1,1],
  2.   
  3. [2,1,2]
  4.   

3)tag_posts:

  
      
  1. [1,101],
  2.   
  3. [2,102],
  4.   
  5. [1,201],
  6.   
  7. [3,202]
  8.   

我使用此查询对3个表进行了简单的内连接:

SELECT tp.*
FROM pages p
JOIN page_tags pt ON pt.page_id = p.id
JOIN tag_posts tp ON tp.tag_id = pt.tag_id
WHERE 1

但是,这会从上面的示例tag_posts表中返回第1,2和3行,而我只想要第1行和第2行,因为这两行匹配 ALL 来自页面之间第一次连接的tag_id行page_tags表。

请让我知道如何实现这一目标。注意:我使用的是mysql。

1 个答案:

答案 0 :(得分:1)

我很困惑。 tag_post表确实有3个匹配(第1行和第2行),因为tag_id = tag匹配的tag_id = 1。所以我会说你所看到的正确。

如果您要查找指定页面的tag_posts,则查询将为此...

SELECT tp.*
FROM pages p
JOIN page_tags pt ON pt.page_id = p.id
JOIN tag_posts tp ON tp.tag_id = pt.tag_id
WHERE p.id = 1