2009-09-16 5 views
0

C'est un problème que je rencontre souvent, et ma solution doit toujours exécuter de nombreuses requêtes, mais je pense qu'il doit y avoir un meilleur moyen. Voici mes deux tables pour cet exemple:Comment puis-je récupérer des listes dans des listes (similaires aux tableaux multidimensionnels)?

Artistes
id
nom

Chansons
id
ArtistlD
nom
genre

Le tableau sont liés en tant que tels:
artists.id < -> songs.artistID

Je voudrais chercher une liste de tous les artistes et en même temps chercher une liste de toutes les chansons par artiste. Je voudrais éviter les noms d'artistes en double dans mon jeu de résultats, de sorte que je n'ai pas à nettoyer l'ensemble de données en PHP. Voici un exemple du format que je voudrais que les données soient dans:

array(0 => array('name' => 'Artist A' 
        , 'songs' => array(0 => array('name' => 'Song 1' 
               , 'genre' => 'rock' 
               ) 
            ) 
            1 => array('name' => 'Song 2' 
               , 'genre' => 'rock' 
               ) 
            ) 
       ) 
     1 => array('name' => 'Artist B' 
        , 'songs' => array(0 => array('name' => 'Song 3' 
               , 'genre' => 'rap' 
               ) 
            ) 
            1 => array('name' => 'Song 4' 
               , 'genre' => 'rap' 
               ) 
            ) 
       ) 
    ) 

(Je sais que ce n'est pas un format MySQL, mais il est le plus proche façon dont je pourrais expliquer)

Est-ce possible ? Si c'est le cas, comment?

Merci!

Répondre

1

La meilleure chose que je puisse suggérer est une requête pour les enregistrements parents suivie d'une requête pour les enfants utilisant une requête in (liste d'id parent). Cela vous donnera deux ensembles de données. Un pour les parents et un pour les enfants. Du côté client, vous pouvez alors prendre un identifiant parent et obtenir un ensemble d'enregistrements enfants.

+0

Je ne connais pas très bien la clause IN, mais j'y reviendrai. Merci. –

+0

SELECT * FROM Table1 où Table1ID IN (1, 2, 3, 4, 5, 6) Vous pouvez faire la même chose avec SELECT * FROM CHANSONS où ArtistID IN (1, 2, 3, 4). Si vous avez une poignée d'artistes, vous pouvez ensuite obtenir toutes les chansons de cet artiste en sélectionnant leur liste d'ID (ou vous pouvez faire une jointure directe). Mais avec une collection d'artistes et une collection de leurs chansons, vous devriez être en mesure de réaliser ce que vous cherchiez à faire. –

0

Je crains que ce ne soit pas possible de faire ce que vous voulez parce que SQL est intrinsèquement un langage basé sur un ensemble. Vous pouvez obtenir toutes les informations que vous recherchez dans un appel via l'utilisation de jointures de table, mais après cela, vous devrez les analyser et les stocker dans la structure que vous avez mentionnée.

1

Option 1:

  1. Interrogez la table artistes
  2. Pour chaque artiste:
    1. stockent les informations dans un tableau.
    2. interroger la table chansons et attacher les résultats au tableau

Plus:
Aucune information inutile étant passé de la base de données.

CONs:
Potentiellement beaucoup de requêtes en cours d'exécution.

Option 2:

  1. Questionner les tables à l'aide d'un join (peut-être une jointure gauche serait le mieux), commande par artiste
  2. Pour chaque ligne:
    1. Vérifiez si cette ligne de artiste est le même que le dernier:
      • sinon, stocker les informations de l'artiste dans le niveau supérieur d'un tableau
    2. l'info magasin chanson dans un sous-ensemble du tableau de l'artiste

Plus:
Une seule requête nécessaire.

CONs:
Potentiellement beaucoup de données inutiles sont transmises depuis la base de données.

+0

L'option 2 est plus compliquée, mais probablement plus efficace en termes de travail avec la base de données. Merci. –

Questions connexes