2011-08-13 10 views
3

私はテーブルが3つあります:singerssongsalbumsです。彼らはすべてに関連付けられている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曲があります。

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

EDIT:アルバムを表示

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'] 
} 

:曲の名前を表示する

echo $results[0]['singer_name'] 

:これは

は、歌手名を表示...私はそれらを表示する方法です。 曲テーブルにアルバムテーブルへの参照がありますが、 album_id私はまだアルバムのない曲ですので、ちょうど結果を得る必要があります singer_id

私が得る必要があるもの: 11曲。 3枚のアルバム。 歌手。

ありがとうございます。

編集: このソリューションは私のために働いた。 私が欲しかったのは、指定した歌手の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のおかげで、私は必要な結果を得ています。

しかし、もう別の問題があります。 iは、3枚のアルバムと11曲

曲が正しく表示されているが、私は再び33枚のアルバムを取得したアルバムにforeachループを作るとき....

は、どのように私は正しくアルバムを表示することができますか?私は3つのアルバムしか持っていません。 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

このロジックを使用すると、クロス結合が得られます。ソングは特定のアルバムにも関連しているはずです - あなたが得ているのは、すべてのアルバムに関連するすべての曲のリストです。 – GalacticCowboy

+0

@GalacticCowboy:論理、はい - LEFT JOIN'dクエリは提供されません。いずれにしても、クエリによって返されるガベージデータがたくさんある可能性があります。 –

+0

#galacticcowboy私は曲のためのアルバムを参照できるだけで、まだアルバムが付いていない曲もあります。 – ParparDromi

答えて

2

あなたはすべての曲をしたい

+0

それは良い解決策ですが、私は今別の問題を抱えています。私の編集を見てください。 – ParparDromi

+0

@parpardromi:そのようなことについて新しい質問をしてください。私は同様の質問に答えました:[変化する値だけを表示する方法](http://stackoverflow.com/questions/1459201/array-how-to-display-the-changing-values-only/1459239#1459239) – knittl

+0

ありがとう、私は新しい質問を開始します。 – ParparDromi

0

したい主なものは、曲、アーティストを持っている必要がありますが、持っていること/またはアルバムを持っていない、歌です。曲から選択して左結合を実行して、他のテーブルから潜在的なデータを取得します(より適切な表現を得るために並べ替えてください)。

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

この質問にはアーティストがいない曲は表示されません。また、メンテナンス性が低下するため、右結合は避けるべきです。 – Arjan