2013-10-15 22 views
0

我有3個表:SQL查詢 - 加入在先前的所有行加入

  1. 頁(ID,姓名,DESC)
  2. page_tags(ID,PAGE_ID,TAG_ID)
  3. tag_posts (TAG_ID,POST_ID)

給出一個頁面在頁面表,我想要得到的職位tag_posts表,其中TAG_ID匹配全部 page_tags表中給定頁面的tag_ids。

舉例來說,如果在3個表中的條目是:

1)的網頁:

  1. [1,頁面1「, '一些降序']

2)page_tags:

  1. [1,1,1],
  2. [2,1,2]

3)tag_posts:

  1. [1,101],
  2. [2,102],
  3. [1,201],
  4. [3,202]

我沒有使用這個查詢的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 

然而,這將返回上面而我想只行1從樣品tag_posts表中的行1,2和3和2這兩行匹配全部 tag_id第一次連接頁面和page_tags表之間的行。

請讓我知道如何才能做到這一點。注意:我正在使用mysql。

回答

1

我很困惑。 tag_post表確實有3個匹配項(第1行2和第3行),因爲tag_post其中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 
+0

我的第一個連接是網頁和page_tags之間,這讓我對給定頁面的所有標籤。我希望第二次加入給我的帖子匹配所有來自第一次加入的標籤。我希望我明確表達了我的要求。 – Rainbard

+0

你的加入是正確的。在上面的示例中,頁面1在page_tags表中被引用兩次。在英文中,第1頁的標籤帶有標識1和2.這些標籤在tag_posts表中被引用了3次。在tag_posts表中,第1行和第3行引用標記1,第2行引用標記2.這就是爲什麼您爲頁面1獲得3個標記而不是2個標記。如果我錯誤地解釋你的表格,請告訴我。 –