MySQL LEFT JOIN проблема с несколькими таблицами - PullRequest
3 голосов
/ 13 августа 2011

У меня есть 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 = ?

Но проблема в том, что я не могу правильно отобразить результаты.

Допустим, у певца есть 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 певец.

спасибо заранее.

РЕДАКТИРОВАТЬ: это решение работало для меня.я хотел получить все песни для указанного идентификатора певца и альбомы, результаты которых я хотел, выглядит следующим образом.

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 альбома.

Ответы [ 2 ]

2 голосов
/ 13 августа 2011

вы хотите все песни. выберите из песен и выполните левое соединение, чтобы получить потенциальные данные из других таблиц (упорядочить, чтобы получить лучшее представление):

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 голосов
/ 13 августа 2011

Главное, что вы хотите - это песни, песня должна иметь исполнителя, но может иметь / не иметь альбом:

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 = ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...