2013-07-01 2 views
1

J'essaie de joindre des tables pour empêcher trop de requêtes de base de données, mais je n'aime pas la façon dont les données retournent.Joindre correctement des tables sans répétition de données

la requête:

SELECT person.name, dog.dog_name FROM person JOIN dog ON person.id = dog.person_id 

Le retour ressemble à ceci:

Array 
(
[0] => Array 
    (
     [name] => Jim 
     [dog_name] => Wolf 
    ) 

[1] => Array 
    (
     [name] => Jim 
     [dog_name] => Frisky 
    ) 

[2] => Array 
    (
     [name] => Tina 
     [dog_name] => Pokedot 
    ) 

[3] => Array 
    (
     [name] => Tina 
     [dog_name] => Spiky 
    ) 
) 

Est-il possible d'avoir la requête de retour à la place quelque chose comme:

Array 
(
[0] => Array 
    (
     [name] => Jim 
     [dog_name] => array(Wolf, Frisky) 
    ) 

[1] => Array 
    (
     [name] => Tina 
     [dog_name] => array(Pokedot, Spiky) 
    ) 
) 
+2

bases de données standard ne fonctionnent que sur les relations (à savoir tables). Il est généralement considéré comme mauvais qu'une cellule de cette table stocke un tableau (voir [normalisation] (https://en.wikipedia.org/wiki/Database_normalization) pour plus de détails). Si j'étais vous, je voudrais juste analyser la table dans votre programme et transformer dans le formulaire que vous aimez. –

Répondre

8

La solution la plus proche est :

SELECT person.name, GROUP_CONCAT(dog.dog_name) AS dog_names 
FROM person JOIN dog ON person.id = dog.person_id 
GROUP BY person.id 

Ceci renvoie une chaîne qui est une liste de noms de chiens séparés par des virgules, et non un tableau PHP. Vous devrez explode() cette chaîne dans le code de l'application.

Notez que la limite de longueur par défaut pour GROUP_CONCAT() est de 1 024 caractères et qu'elle est contrôlée par l'option de configuration group_concat_max_len.


Je suis d'accord avec le commentaire de @KonstantinWeitz, il vaut la peine de laisser le SGBDR faire ce qu'il est au mieux, puis utiliser le code PHP pour post-traiter les résultats dans un format que vous voulez.

Par exemple, voici comment je le ferais revenir le tableau que vous avez décrit:

$peoplesdogs = array(); 
$stmt = $pdo->query("SELECT person.name, dog.dog_name FROM person JOIN dog ON person.id = dog.person_id"); 
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    $peoplesdogs[$row["name"]]["name"] = $row["name"]; 
    $peoplesdogs[$row["name"]]["dog_name"][] = $row["dog_name"]; 
} 
return array_values($peoplesdogs); 
Questions connexes