2010-10-29 6 views
22

J'ai donc ce tableau:comment faire array_agg() travailler comme group_concat() de mySQL

create table test (
    id integer, 
    rank integer, 
    image varchar(30) 
); 

Puis quelques valeurs:

id | rank | image 
---+------+------- 
1 | 2 | bbb 
1 | 3 | ccc 
1 | 1 | aaa 
2 | 3 | c 
2 | 1 | a 
2 | 2 | b 

Je veux les regrouper par identifiant et concaténer la nom de l'image dans l'ordre donné par le rang. En mySQL je peux le faire:

select id, 
     group_concat(image order by rank asc separator ',') 
    from test 
group by id; 

Et la sortie serait:

 
1 aaa,bbb,ccc 
2 a,b,c 
Est-il possible que je peux avoir cela en postgresql?

Si j'essaie d'utiliser array_agg() les noms ne s'afficheront pas dans le bon ordre et apparemment je n'ai pas réussi à trouver un moyen de les trier. (J'utilisais postgres 8.4)

Répondre

38

Dans PostgreSQL 8.4 vous ne pouvez pas commander explicitement array_agg mais vous pouvez contourner le problème en ordonnant les lignes passées dans le groupe/total avec une sous-requête:

SELECT id, array_to_string(array_agg(image), ',') 
FROM (SELECT * FROM test ORDER BY id, rank) x 
GROUP BY id; 

Dans PostgreSQL 9.0 expressions globales peuvent avoir une clause ORDER BY:

SELECT id, array_to_string(array_agg(image ORDER BY rank), ',') 
FROM test 
GROUP BY id; 
+0

en fait, si j'ajouter des lignes à ma table de test cette solution ne fonctionne pas. Assez étonnamment ne fonctionne pas pour moi même si je charge la table dans le bon ordre. Cependant, votre solution ne fonctionne dans postgresql 8.4 que si je trier la sous-requête par son identifiant et son rang. bizarre si vous me demandez – user491575

+0

La solution de contournement est un peu hacky et il semble montrer pour vous. Je soupçonne qu'il y a une différence de plan de requête provoquant ceci. Je suis un peu curieux de savoir quelle est votre sortie 'EXPLAIN' avec le mauvais résultat. Dans tous les cas, j'ai mis à jour ma réponse avec 'ORDER BY id, rank'. –

+0

Je veux d'abord vous remercier pour la réponse. Cela résout le problème que j'avais. – user491575

Questions connexes