2010-05-03 3 views
1

J'ai deux tables, une pour listings et une autre représentant une liste de tags pour la table listings.Fusion des entrées de ligne MySQL en une seule ligne

Dans le tableau listings, les identifiants d'étiquette sont stockés dans un champ appelé tags en tant que 1-2-3-. Cela a très bien fonctionné pour moi (expressions régulières et jointures pour séparer et afficher les données), mais je dois maintenant tirer les titres de ces étiquettes dans une seule rangée. Voir ci-dessous.

listings table 
id tags 
1  1-2-3- 
2  4-5-6- 


tags table 
id title 
1  pig 
2  dog 
3  cat 
4  mouse 
5  elephant 
6  duck 

Et ce que je dois produire de la table listings est:

id  tags 
2  mouse, elephant, duck 

Répondre

1

Voici une requête qui pourrait aider. Mais comme il effectue certaines opérations de chaîne, il peut ne pas être aussi bon qu'une jointure régulière:

select l.id, group_concat(t.title) 
    from listings l, tags t 
    where concat('-', l.tags) like concat('%-', t.id, '-%') group by l.id ; 
+0

Merci, c'est parfait et exactement ce dont j'ai besoin. –

+0

Ma version à partir de votre version: SELECT l.id, GROUP_CONCAT (t.title) FROM liste l, étiquettes t O WH l.tags REGEXP CONCAT ('[[: <:]]', t.id, ' [[:>:]] ') GROUP BY l.id; –

0

GROUP_CONCAT() + INNER JOIN + GROUP BY

+0

Cela fonctionne très bien pour un résultat à une ligne, en essayant de l'utiliser avec plusieurs lignes. –

1

Malheureusement, avec vos étiquettes stockées dans ce format dénormalisé , il n'y a pas de moyen facile d'aller de 1-2-3 aux balises correspondantes. En d'autres termes, il n'y a pas de moyen simple de séparer les identifiants, de se joindre à une autre table, puis de se recombiner. Votre meilleure option serait de créer une table listing_tag avec deux colonnes

listing_id tag_id 
1    1 
1    2 
1    3 
2    4 
2    5 
2    6 

et alors il est juste un simple rejoindre:

SELECT listing_id, GROUP_CONCAT(title SEPARATOR ', ') FROM listing_tag JOIN tags ON tags.id = tag_id 
+0

Mais maintenant votre séance avec plusieurs entrées dans le tableau de liste? –

+0

@Derrick, oui cela ne fait que dupliquer certaines données mais il suit une pratique de normalisation bien établie qui rend beaucoup d'autres choses beaucoup plus simples: http://en.wikipedia.org/wiki/First_normal_form –

Questions connexes