2009-11-19 104 views
1

我有一個表,其中包含主題類型另一個持有材料。然後我有另一個表格,它保存着每個表格的關鍵字,從而創建了多對多的關係。與SQL查詢問題

但是,當我嘗試搜索主題以挑選出共享相同材質的兩個主題時,該功能無效。

示例表:

材質表:

MatID | Name 
--------------- 
1  | book1 
2  | note23 

主題表:

TID | topic 
--------------- 
1 | computer 
2 | database 

MatTop表:

TID | MatID 
------------ 
1 | 2 
2 | 2 

這是我的查詢:

SELECT * FROM material 
INNER JOIN mattop ON material.MatID = mattop.MatID 
INNER JOIN topic ON mattop.TID = topic.TID 
WHERE (topic.topic = 'computer') AND (topic.topic = 'database') 

感謝您的任何幫助。

編輯 - 我知道AND是錯誤的遺憾。我的意思是如何讓它輸出具有相關主題的材料。

回答

3

要獲得兩個不同的主題,需要加入兩次。 (所以桑尼男孩是在正確的問題是where子句,但或者不是正確答案)

喜歡的東西(注意我沒有表,因此沒有測試SQL)

編輯注:對不起,我想用2個mattops原來是正確的有這樣一個版本只有一個,所以我已經恢復到原來的

SELECT * FROM material 
    INNER JOIN mattop mattop1 ON material.MatID = mattop1.MatID 
    INNER JOIN topic topic11 ON mattop.TID = topic1.TID 

    INNER JOIN mattop mattop2 ON material.MatID = mattop2.MatID 
    INNER JOIN topic topic2 ON mattop.TID = topic2.TID 


    WHERE (topic1.topic = 'computer') AND (topic2.topic = 'database') 

這應該給計算機和數據庫的這兩個主題所用的材料。 Where子句中的一個簡單OR將至少給出其中一個主題的材料,但不一定都是這兩個材料

+0

非常感謝!我明白了我現在必須做的事情。 – jumm 2009-11-19 20:19:23

7

您的問題是在where子句中:

WHERE (topic.topic = 'Design') AND (topic.topic = 'Notes') 

topic.topic不能既是「設計」,並在同一時間的「注意」。

你的意思是讓你的AND成爲OR?

1

如果我正確理解了您,您希望共享相同材質的主題。

這裏是你如何做到這一點:

SELECT t1.*,t2.* FROM topic t1 
JOIN mattop mt1 ON t1.TID = mt.TID 
JOIN mattop mt2 ON mt2.MatID = mt1.MatID 
JOIN topic t2 ON t2.TID = mt2.TID 
WHERE t2.TID <> t1.TID 

這將產生對共享相同材料的主題列表。

,因爲SQL連接在一起,好像他們是1行/線表,你不能有兩個不同的主題值在同一時間,除非你在主題表連接兩次