私はテーブルが3つあります:singers
、songs
、albums
です。彼らはすべてに関連付けられているsinger_id
MySQL 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 = ?
このロジックを使用すると、クロス結合が得られます。ソングは特定のアルバムにも関連しているはずです - あなたが得ているのは、すべてのアルバムに関連するすべての曲のリストです。 – GalacticCowboy
@GalacticCowboy:論理、はい - LEFT JOIN'dクエリは提供されません。いずれにしても、クエリによって返されるガベージデータがたくさんある可能性があります。 –
#galacticcowboy私は曲のためのアルバムを参照できるだけで、まだアルバムが付いていない曲もあります。 – ParparDromi