2009-10-01 9 views
0

C'est très déroutant; il semble que je devrais avoir au moins une relation plusieurs-à-plusieurs.MySQL: Comment stocker/récupérer des informations sur un artiste?

  1. Une piste peut être chantée par 2+ artistes - comment puis-je stocker cela dans la base de données?
  2. Tout en montrant cette piste, je veux un lien vers chaque artiste afin que lorsque les utilisateurs cliquent sur la piste, il ouvre la page de profil de cet artiste.

Quelqu'un peut-il m'aider à concevoir une classe ou des classes pour y parvenir?

+0

Qu'avez-vous essayé? – SilentGhost

+0

Ça sent le devoir. Beaucoup à plusieurs relations que les deux réponses état. –

Répondre

2

Essayez quelque chose comme ça

 
tblSongs 
    SongId 
    Title 
    YearProduced 
    etc. 

tblArtist 
    ArtistId 
    Name 
    ProfilePage 
    etc.. 

tblSongArtists 
    SongId 
    ArtistId 

Vos requêtes pourrait ressembler à quelque chose comme

SELECT Title, YearProduced, Name, ProfilePage 
FROM tblSongs S 
LEFT OUTER JOIN tblSongArtists SA ON SA.SongId = S.SongId 
LEFT OUTER JOIN tblArtists A ON A.ArtistId = SA.ArtistId 
WHERE Title = 'I got the blues' -- .... 
ORDER BY SongId -- or Song Title (*) 

(*) commande par article est dans le cas où les critères de recherche produit plus d'une chanson, et si vous souhaite garder les artistes pour une chanson donnée en séquence.
Une telle requête produit plusieurs lignes pour une chanson avec plusieurs artistes, une ligne par artiste, les valeurs des colonnes de tblSongs étant répétées.

+0

Je m ajoute également artist_id dans ma table d'album ... n aussi dans la table de piste ..m je me trompe? – sunidhi

+0

Je pense qu'il n'y a pas d'utilisation de artist_id dans la table de l'album ... ça devient confus. – sunidhi

+1

@sunidhi En ajoutant (ou non) artist_id à la table de l'album ... C'est à éviter, car je suppose qu'il est possible d'avoir des artistes serveur associés à un album donné. Vous aurez alors besoin d'une table tblAlbumArtists (similaire à tblSongArtists), ou de sélectionner la liste des artistes [pour un album donné] indirectement avec un peu comme: tblAlbums -> tblbSongs -> thlSongArtists -> tblArtists Dans une telle requête vous auriez Vous devez utiliser DISTINCT pour que chaque artiste ne soit répertorié qu'une seule fois, même s'il peut être lié à plusieurs chansons de l'album. – mjv

1

Toute relation plusieurs-à-plusieurs nécessite trois tables. Pour votre exemple:

Song<br/> 
Name SongID 

Artist <br/> 
Name ArtistID 

ArtistsInSongs <br/> 
ArtistID SongID 

Je vais vous laisser comprendre le reste.

0
public static function find_artist_on($track_id=0) { 
    global $database; 
    $sql = "SELECT * FROM " . self::$table_name ." s " ; 
    $sql .= "LEFT OUTER JOIN trackartist TA ON TA.track_id =s.track_id"; 
    $sql .= "LEFT OUTER JOIN artist A ON A.artist_id =TA.artist_id"; 
    $sql .= " WHERE s.artist_id=" .$database->escape_value($track_id); 
    $sql .= " ORDER BY artist_id ASC"; 
    return self::find_by_sql($sql); 
    } 
Questions connexes