2011-08-13 66 views
3

我有3個表:singerssongs,albums。他們都與singer_idMySQL LEFT JOIN多表邏輯問題

即使沒有匹配singer_id我需要得到他們所有人。我設法讓所有的人都與此查詢:

SELECT singers.singer_name, albums.album_name, songs.song_name 
    FROM singers 
LEFT JOIN albums ON singers.singer_id = albums.singer_id 
LEFT JOIN songs ON albums.singer_id = songs.singer_id 
    WHERE singer_id = ? 

但問題是,我可以;噸正確顯示的結果。

假設歌手有3張專輯和11首歌曲。我這是怎麼顯示出來......

顯示歌手名稱:

echo $results[0]['singer_name'] 

顯示歌曲名稱:

foreach($results as $song) { 
    // PROBLEM: instead of getting 11 songs i'm getting 33 results so each song show up 3 times. 
    echo $song['song_name'] 
} 

顯示專輯:

foreach($results as $album) { 
// PROBLEM: i'm getting 33 albums instead of 3 each album shows up 3 times. 
    echo $album['album_name'] 
} 

編輯: 歌曲表參照專輯表album_id但是第是沒有專輯的歌曲,所以我需要得到的結果只是由singer_id

我需要得到的是: 11首歌曲。 3張專輯。 1名歌手。

在此先感謝。編輯: 這個解決方案爲我工作。 我想要的是獲得指定歌手ID和專輯的所有歌曲 我想要的結果看起來像這樣。

singer_name : song_name  : album_name 
............................................................... 
Jay Z  : 99 Problems : NULL 
Jay Z  : Gotta Have It : Watch the Throne 

所以我想讓所有歌手的歌曲即使他們沒有在任何專輯呢。

這是我使用的查詢。

SELECT singers.singer_name, songs.song_name, albums.album_name 
FROM singers 
LEFT JOIN songs ON singers.singer_id = songs.singer_id 
LEFT JOIN albums ON albums.album_id = songs.album_id 
WHERE singers.singer_id = ? 

感謝@ knittl我得到了我需要的結果。

但現在還有另一個問題。 我有3張專輯和11首歌曲

歌曲顯示正常,但是當我在做專輯一foreach循環,我再次得到33張專輯....

我怎樣才能正確顯示相冊?我只有3張專輯。

+0

使用該邏輯,您將獲得交叉連接。一首歌也應該與特定專輯相關 - 你得到的是與每張專輯相關的每首歌曲的列表。 – GalacticCowboy

+0

@GalacticCowboy:邏輯,是的 - 但不是提供的LEFT JOIN'd查詢。無論哪種方式,查詢都會返回大量垃圾數據。 –

+0

#galacticcowboy我知道我可以參考歌曲的專輯,但是有沒有專輯附加到他們的歌曲呢。 – ParparDromi

回答

2

你想要的所有歌曲。從歌曲中選擇並執行左連接以從其他表中獲取潛在數據(按順序獲得更好的表示):

SELECT a.artist_name, COALESCE(b.album_name, '(no album)'), s.song_name, 
FROM songs s 
LEFT JOIN artists a 
ON s.singer_id = a.singer_id 
LEFT JOIN albums b 
ON s.album_id = b.album_id AND s.singer_id = b.singer_id 
ORDER BY a.artist_name, b.album_id 
+0

感謝這是一個很好的解決方案,但我現在有另一個問題。看看我的編輯。 – ParparDromi

+0

@parpardromi:請爲此類問題開個新問題。我已經回答了類似的問題:[只顯示更改值](http://stackoverflow.com/questions/1459201/array-how-to-display-the-changing-values-only/1459239#1459239) – knittl

+0

謝謝我將開始一個新的問題。 – ParparDromi

0

你想最主要的是歌曲,一首歌曲必須有一個藝術家,但可能有/或沒有專輯:

SO:

SELECT  singers.singer_name, IF('' == albums.album_name, 'single', albums.album_name) AS album_name, songs.song_name 
FROM  songs AS songs 
RIGHT JOIN singers AS singers ON (singers.singer_id = songs.singer_id) 
LEFT JOIN albums AS albums ON (albums.singer_id = songs.singer_id) 
WHERE  songs.singer_id = ? 
+0

什麼是'單個'字符串? – ParparDromi

+0

該查詢不顯示沒有藝術家的歌曲。也應該避免加入連接,因爲它們降低了可維護性。 – Arjan