2013-01-09 29 views
0

我有一個帖子的數據庫,每個帖子都有標籤。這些表分別被命名爲PostsTags。我還有第三個表,名爲Posts_Tags,它維持這兩個表之間的多對多關係。從多對多關係的末端選擇數據

爲了做到這一點,我的帖子和我的標籤表都有一個id列。因此,我的Posts_Tags表具有用於存儲映射的postidtagid列。

例如,我正在查詢標題中包含單詞「class」的所有帖子。我可以用這個查詢很容易做到這一點:

SELECT * FROM Posts WHERE title LIKE '%{class}%' 

不過,現在我想查詢所有帖子,不僅有「類」的稱號,而且還標有「Java」的標籤。

SELECT id FROM Tags WHERE name='Java' 

然後,我可以把它插入到我的第一個查詢,像這樣的:我可以在兩個單獨的查詢,在那裏我第一次獲得了Java標籤的ID做到這一點

SELECT  Posts.* 
FROM  Posts 
INNER JOIN Posts_Tags 
     ON Posts.id=Posts_Tags.postid 
WHERE  Posts_Tags.tagid='$java_tag_id' 
      AND title LIKE '%{class}%' 

然而,我知道我可以在單個查詢中做到這一點,我只是不知道如何。在做一個連接時,我仍然需要考慮很多關於連接的問題,並且在同一個查詢中執行多個連接會讓我頭暈目眩。我應該如何構建我的查詢來執行此操作?

回答

2
SELECT p.* 
     FROM Posts p 
     JOIN Posts_Tags pt 
     ON pt.postid = p.id 
     JOIN tags t 
     ON t.id = pt.tagid 
    WHERE t.tag='java' 
     AND p.title LIKE '%{class}%'; 
+0

很好,謝謝。我認爲我有點過度了,嘿。無論如何,這完美的作品! –

0
SELECT 
    p.* 
FROM posts as p 
INNER JOIN Posts_Tags pt ON pt.post_id = p.id 
INNER JOIN Tags as t ON pt.tags_id = t.id 
WHERE t.tag='java' 
AND p.title LIKE '%keyword%';