2010-11-01 4 views
0

Dans le scénario hypothétique où j'ai deux tables de base de données, dans une relation un à plusieurs. Je suis en train de trouver une fonction belle requête pour que je puisse retourner chaque ligne dans le tableau A avec un tableau imbriqué pour toutes les lignes liées de la table B.requête renvoyant des tableaux groupés multidimensionnels

SELECT a.id AS id,a.name as name,b.id AS b_id,b.name AS b_name FROM a,b WHERE a.id=b.eid; 

retournera un seul résultat

SELECT 
    a.id AS id, 
    a.name as name, 
    GROUP_CONCAT(b.id) AS b_id, 
    GROUP_CONCAT(b.name) AS b_name 
FROM a,b 
WHERE a.id = b.eid; 

alors que cela renvoie ce que je veux, mais je suis après un tableau pas une chaîne (il pourrait y avoir des virgules dans b.name)

Qu'est-ce qui me manque?

+0

Quelle est la clé liée? Est-ce que b.id une clé étrangère? – Stephen

+0

c'est un bon point clé liée serait quelque chose d'autre - b.Eid, je l'ai mis à jour dans la question ci-dessus – kalpaitch

+0

pourriez-vous être plus précis ce que voudrait accomplir ... comme je le comprends, vous devriez utiliser explode()? – Breezer

Répondre

1

Vous pouvez utiliser le séparateur différent de la virgule:

GROUP_CONCAT(b.name SEPARATOR ';') AS b_name 
+0

Oui parfait, acclamations, juste pensé de moi-même. Par curiosité si l'on ne peut garantir qu'un caractère ou une combinaison de caractères ne sera pas dans la valeur b_name. Sont les autres méthodes? – kalpaitch

+0

Eh bien, vous pouvez utiliser un séparateur très long et aléatoire, ils seront partis quand vous l'avez explosé faire 3 signes de long et je doute qu'ils jamais confondre avec le texte ordinaire un bon séparateur "# & £" = D – Breezer

+0

Vous peut s'échapper du séparateur existant avec un autre séparateur char: 'GROUP_CONCAT (REPLACE (b.name, ';', ';;') SEPARATOR ';') AS nom_base mais cela nécessite aussi un traitement spécial lors de l'utilisation des données. –

1

Il est impossible de retourner quoi que ce soit autre qu'un type de données MySQL, donc la réponse est non, vous ne pouvez pas retourner un tableau (imbriquée ou autre) résultats d'une sous-requête. Vous verrez également des hits de performance assez drastiques en essayant de construire des valeurs de chaînes concaténées à partir de l'étranger, l'ordre des sous-chaînes sera implicite et, comme vous l'avez mentionné, vous aurez des problèmes pour sélectionner un délimiteur approprié.

Il va certainement être plus efficace d'utiliser un simple JOIN pour créer un ensemble de résultats unique. Tous les doublons du côté "un" de la relation doivent être gérés par programmation (ce qui est préférable, dans tous les sens, pour gérer le fractionnement de chaînes sur plusieurs champs concaténés).

Questions connexes