我有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首歌曲。我这是怎么显示出来......
显示歌手名称:
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张专辑。
使用该逻辑,您将获得交叉连接。一首歌也应该与特定专辑相关 - 你得到的是与每张专辑相关的每首歌曲的列表。 – GalacticCowboy
@GalacticCowboy:逻辑,是的 - 但不是提供的LEFT JOIN'd查询。无论哪种方式,查询都会返回大量垃圾数据。 –
#galacticcowboy我知道我可以参考歌曲的专辑,但是有没有专辑附加到他们的歌曲呢。 – ParparDromi