2010-12-13 4 views
0

У меня есть БД MySQL с 3 таблицами:MySQL извлечения данных из 2 таблиц с помощью таблицы корреляции

  1. художники (artist_id, имя)
  2. альбомов (album_i, название) и третья таблица корреляции:
  3. albums_artists (album_id, artist_id)

Моя цель состоит в том, чтобы отобразить список всех художников и рядом с именем каждого художника, названия всех альбомов этого исполнителя выпустили. (Альбом «принадлежит» только один художник, художник может иметь более чем один альбом, конечно)

Было бы замечательно, если могли бы получить результат, как:

1 «AC/DC» 3 " пусть будет рок "
1 "AC/DC" 4 "высокого напряжения"
2 "темно-фиолетового" 45 "головка машины"
2 "темно-фиолетового" 49 "в рок"
3 "Motorhead" 666" ace of spades "num

(Первое число в каждой строке является artist_id, а второе - album_id).

Каким будет подходящий запрос?

+0

Из любопытства: Если альбом принадлежит только одному художнику, как же это сбылось, что 'artist_id' это не просто поле на' album' таблицы? –

+0

Ты так прав. для этого конкретного примера было бы достаточно. в других сценариях в моем проекте все может быть немного по-другому: песня может «иметь» нескольких авторов и т. д. thanx для вашего замечания. это обычная практика новичков, чтобы сделать вещи более сложными, чем они должны быть. :-) – samoyed

ответ

1
select 
    artist_id, 
    album_id, 
    ... 
from 
    albums_artists 
join albums on albums.id = albums_artists.album_id 
join artists on artists.id = albums_artists.artist_id 
0

Что-то вроде этого:

select ar.artist_id, ar.name, al.album_id, al.title 
    from artists ar 
    join album_artists aa on aa.artist_id = ar.artist_id 
    join albums al on al.album_id = aa.album_id and ar.artist_id = aa.artist_id 
order by ar.artist_id 
0
select a.artist_id, a.name, al.album_id, al.title 
from artists a, albums al, albums_artists ala 
where a.artist_id = ala.artist_id 
and ala.album_id = al.album_id 
order by ala.artist_id 
1
SELECT ar.artist_id, ar.name, al.album_id, al.title 
    FROM artists ar 
     INNER JOIN albums_artists aa 
      ON ar.artist_id = aa.artist_id 
     INNER JOIN albums al 
      ON aa.album_id = al.album_id 
    ORDER BY ar.name, al.title 

И, просто для удовольствия, что, если есть художник, который не выпустил ни одного альбома.

SELECT ar.artist_id, ar.name, al.album_id, al.title 
    FROM artists ar 
     LEFT JOIN albums_artists aa 
      INNER JOIN albums al 
       ON aa.album_id = al.album_id 
      ON ar.artist_id = aa.artist_id 
    ORDER BY ar.name, al.title