У меня 3 стола: singers
, songs
, albums
. Все они связаны с singer_id
Мне нужно получить все из них, даже если нет соответствующего 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 = ?
Но проблема в том, что я могу; t правильно отображать результаты.
Скажем, у певицы 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'] }
EDIT: в таблице песен есть ссылка на таблицу альбомов album_id
но есть песни без альбома, поэтому мне нужно получить результаты только с помощью singer_id
что мне нужно получить: 11 песен. 3 альбома. 1 певец.
заранее спасибо.
EDIT: это решение сработало для меня. я хотел бы получить все песни для указанного идентификатора исполнителя и альбомы, результаты, которые мне нужны, выглядят так.
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 альбома.
вы хотите все песни. выберите из песен и выполните левое соединение, чтобы получить потенциальные данные из других таблиц (чтобы получить более приятное представление):
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
Главное, что вы хотите – это песни, песня должна иметь художника, но может иметь / не иметь альбом:
ТАК :
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 = ?