2012-06-07 34 views
0

我需要一點幫助。不知道爲什麼我無法理解這一點。mySQL查詢加入關聯表匹配這個AND這個OR

我有一張歌曲,流派和兩者之間的關聯表。

SONGS 
song_id 
song_name 
active (0,1) 

GENRE 
genre_id 
genre_name (rock,jazz,classical,newage,opera) 

ASSOC 
song_id 
genre_id 

我可以做這樣一個簡單的搜索...

SELECT s.song_name, s.song_id 
FROM (songs s) 
LEFT JOIN assoc a ON s.song_id = a.song_id 
WHERE s.active = 1 
AND a.genre_id = 1 

和多搜索這樣的。

SELECT s.song_name, s.song_id 
FROM (songs s) 
LEFT JOIN assoc a ON s.song_id = a.song_id 
WHERE s.active = 1 
AND (a.genre_id = 1 
    OR a.genre_id = 2) 

但是,如果我想得到1和2或3呢?這不起作用。

SELECT s.song_name, s.song_id 
FROM (songs s) 
LEFT JOIN assoc a ON s.song_id = a.song_id 
WHERE s.active = 1 
AND a.genre_id = 1 
AND (a.genre_id = 2 
    OR a.genre_id = 3) 

在此先感謝您的幫助。我有一種感覺,我只是看着這個錯誤的方式。

回答

0

您可以執行自聯接:

SELECT s.song_name, s.song_id 
FROM songs AS s 
    JOIN assoc AS a1 ON a1.song_id = s.song_id AND a1.genre_id = 1 
    JOIN assoc AS a2 ON a2.song_id = s.song_id AND a2.genre_id IN (2,3) 
WHERE s.active = 1 
+1

怎麼可能genre_id = 1和genre_id = 2沒有自我聯合? – jcho360

+0

@ jcho360:很好,我的不好。按照您的建議,我已經引入了自連接。 – eggyal

+0

哎呀,我真的需要爲每個genre_id或我想匹配的genre_ids組創建一個新的JOIN。有一個更好的方法嗎?我曾經在歌曲記錄中使用了ID,並使用了FIND_IN_SET(),但我認爲這會更快。 – Thom

1

試試這個,

SELECT s.song_name, s.song_id 
    FROM (songs s) 
    LEFT JOIN assoc a ON s.song_id = a.song_id 
    WHERE s.active = 1 
    AND (a.genre_id = 1 
    OR a.genre_id = 2 
     OR a.genre_id = 3) 

您的where子句是錯誤的,因爲

AND a.genre_id = 1 AND (a.genre_id = 2 OR a.genre_id = 3) 

這意味着在一排,你有兩個選擇

a.genre_id=1 and a.genre_id=1 or 
a.genre_id=1 and a.genre_id=3 

,你只需要每一個genre_id行,所以在同一行中不能有2個值

+0

「*如果我想獲得1和2或3 *是什麼?」。這個答案沒有提供這個。 – eggyal

+0

@eggyal結果總是0,至少他會自我加入,你看到我的解釋爲什麼會發生? – jcho360

+0

請參閱[我的答案](http://stackoverflow.com/a/10938676/623041)。 – eggyal

0
SELECT s.song_name, s.song_id 
FROM (songs s) 
LEFT JOIN assoc a ON s.song_id = a.song_id 
WHERE s.active = 1 
AND (a.genre_id = 1 
    AND a.genre_id = 2) 
OR a.genre_id = 3 

我認爲這是你在找什麼

+0

會得到1或2或3.我正在尋找1和2或3. – Thom

+0

好的,編輯它,我假設你只能有一種.genre_id – wvm2008