2009-08-18 5 views
1

Supposons que je doive traiter avec beaucoup de grand-mères qui ont beaucoup de chats. J'ai une table granny_cat:Récupérer directement une liste à partir des données d'une colonne avec MySQL

granny_id | kitty_name 
-------------------- 
1   Kizzy 
1   Jimmy 
1   Katty 
2   Georges 
2   Albert 
3   Panther 

et je veux récupérer une liste de mamie 1 chat de, par exemple pour obtenir quelque chose comme (avec la syntaxe php)

array("Kizzy","Jimmy","Katty") 

Cependant, la requête

SELECT kitty_name WHERE granny_id = 1 

retours quelque chose comme

array 
(
    array('kitty_name' => "Kizzy"), 
    array('kitty_name' => "Jimmy"), 
    array('kitty_name' => "Katty") 
) 

ce qui est assez logique, car je peux aller chercher deux ou plusieurs champs avec une requête similaire. Je peux évidemment mapper ce tableau pour obtenir ce que je veux, cependant, je me demande s'il existe un moyen (simple) de l'obtenir directement depuis mysql, ou pas.

Merci.

Répondre

1
SELECT GROUP_CONCAT(kitty_name) 
FROM mytable 
WHERE granny_id = 1 

vous donnera la liste délimitée par des virgules que vous pouvez explode dans un tableau.

MySQL ne prend pas en charge le type de données de tableau natif. Dans PostgreSQL vous seriez en mesure de faire ce qui suit:

SELECT ARRAY 
     (
     SELECT kitty_name 
     FROM mytable 
     WHERE granny_id = 1 
     ) AS kitties 

, qui vous donnera un tableau PHP natif.

+0

Merci, même si je ne peux pas utiliser la solution PostgreSQL, ma curiosité est satisfaite. La liste séparée par des virgules est cependant dangereuse, et si un chat s'appelle "Oh, vous êtes un joli minou !!" ? – user151229

+0

@hlanak, bonne question de suivi. Vous aurez besoin de gérer vos propres délimiteurs de champs (que vous pouvez spécifier dans GROUP_CONCAT via SEPARATOR) et d'échapper. Vous pourriez encoder les champs HEX() avant caténation, par exemple. – pilcrow

0

Une bibliothèque d'encapsulage traitera typiquement ceci, par ex. ADODb a la méthode GetCol():

$names=$db->GetCol('SELECT kitty_name WHERE granny_id = 1'); 
+0

Eh bien, oui, mais je voulais savoir si je pouvais l'obtenir directement depuis mysql. – user151229

Questions connexes