2010-12-13 17 views
0

J'ai un base de données mysql avec 3 tables:mysql récupérer des données à partir de 2 tables via un tableau de correspondance

  1. artistes (artist_id, nom)
  2. albums (album_i, titre) et une troisième table de corrélation:
  3. albums_artists (album_id, artist_id)

Mon but est d'afficher une liste de tous les artistes et à côté du nom de chaque artiste, les titres de tous les albums de cet artiste libéré. (Un album « appartient » à un seul artiste, un artiste peut avoir plus d'un album bien sûr)

Ce serait formidable si pourrait obtenir un résultat comme:

1 « ac/dc » 3 " qu'il y ait rock "
1 "AC/DC" 4 "haute tension"
2 "tête de la machine pourpre" 45 "profond"
2 "pourpre profond" 49 "dans la roche"
3 "motorhead" 666" l'as de pique "num

(Le premier nombre dans chaque rangée étant le artist_id, et le second l'album_id).

Quelle serait la requête appropriée pour cela?

+0

Par curiosité: Si un album appartient à un seul artiste, comment se fait-il que de passer 'artist_id' n'est pas simplement un champ sur la' album' table? –

+0

vous avez tellement raison. pour cet exemple spécifique qui aurait été suffisant. Dans d'autres scénarios de mon projet, les choses peuvent être un peu différentes: une chanson peut avoir plusieurs écrivains etc. Merci pour votre remarque. C'est une pratique courante pour les débutants de rendre les choses plus compliquées qu'elles ne devraient l'être. :-) – samoyed

Répondre

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

Quelque chose comme ceci:

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 

Et, juste pour le plaisir, s'il y a un artiste qui n'a pas publié d'album pour le moment.

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 
Questions connexes