2009-10-16 11 views
20

Ich möchte die Ergebnisse in einer GROUP_CONCAT-Funktion bestellen. Das Problem ist, dass die Auswahl in der GROUP_CONCAT-Funktion ist eine weitere Funktion, wie folgt aus (Fantasie wählen):Bestellung in einem MySQL-GROUP_CONCAT mit einer Funktion darin

SELECT a.name, 
    GROUP_CONCAT(DISTINCT CONCAT_WS(':', b.id, c.name) ORDER BY b.id ASC) AS course 
FROM people a, stuff b, courses c 
GROUP BY a.id 

Ich möchte ein Ergebnis erhalten, wie (von b.id bestellen):

michael 1:science,2:maths,3:physics 

aber ich bekomme:

michael 2:maths,1:science,3:physics 

Wer weiß, wie ich durch b.id in meinem Group_concat hier bestellen können?

+2

[GROUP_CONCAT] (http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat) unterstützt seine eigene 'ORDER BY-Klausel ... Wenn Sie nicht wissen, was die benutzerdefinierte Funktion ist oder nicht, können wir Ihnen nicht helfen. –

+0

Es ist genau wie ich geschrieben habe: die Funktion "concat_ws" innerhalb der Funktion "group_concat". Ich habe nie gesagt, dass es eine benutzerdefinierte Funktion ist. – acme

+0

Es ist unklar, wie man eine gültige Lösung schreibt, da die Tabellenstruktur, der Inhalt und die Beziehungen zwischen den Tabellen nicht spezifiziert sind (d.h. es gibt keine Join-Spezifikationen). – outis

Antwort

37

Wenn jemand sich interessiert, ich glaube, ich eine Lösung für zumindest ein ähnliches Problem gefunden.

http://mahmudahsan.wordpress.com/2008/08/27/mysql-the-group_concat-function/

select GROUP_CONCAT(columnName order by someColumn SEPARATOR '|') from tableName where fieldId = p.id 

Die Reihenfolge, vergeht in der BEFORE GROUP_CONCAT dem Separator, wenn es einen gibt.

+0

Gut gefunden !! Danke für das Teilen! – rckehoe

+0

Ehrfürchtig, Dieser rettete mein Leben – Nadeeshaan

+0

Nice one !! Danke für die Freigabe –

2

Ich kenne keinen Standard Weg, dies zu tun. Diese Abfrage funktioniert, aber ich fürchte, es kommt nur darauf an einigem Implementierungsdetail:

SELECT a_name, group_concat(b_id) 
FROM (
    SELECT a.name AS a_name, b.id AS b_id 
    FROM tbl1 a, tbl2 b 
    ORDER BY a.name, b.id) a 
GROUP BY a_name 
+0

Nach ein wenig Recherche scheint es, was ich nicht fragen kann. Danke trotzdem! – acme

+0

versuchte dies, irgendwie funktioniert nicht – slier

0
SELECT pub_id,GROUP_CONCAT(DISTINCT cate_id) 
FROM book_mast 
GROUP BY pub_id 
ORDER BY GROUP_CONCAT(DISTINCT cate_id) ASC; 
+1

Ich möchte die aggregierten Elemente in der 'GROUP_CONCAT' nicht die gesamten Ergebnisse bestellen. – acme

0
SELECT generated.name, GROUP_CONCAT(generated.data) 
FROM (
    SELECT people.name, CONCAST_WS(":", stuff.id, courses.name) data 
    FROM people, stuff, courses 
    ORDER BY stuff.id, people.name 
) generated 
GROUP BY generated.name 
2

Keine Subselects erforderlich.

SELECT people.name, CONCAT_WS(":", stuff.id, courses.name) data 
FROM people, stuff, courses 
ORDER BY stuff.id, people.name 
3

Ich weiß, das wirklich alt, aber gerade jetzt ich war auf der Suche nach einer Antwort und @ korny Antwort gab mir die Idee für diesen:

SELECT a.name, 
GROUP_CONCAT(DISTINCT CONCAT_WS(':', b.id, c.name) 
      ORDER BY CONCAT_WS(':', b.id, c.name) ASC) AS course 
FROM people a, stuff b, courses c 
GROUP BY a.id 

(Und es funktioniert für mich, wenn das war nicht klar :-))

+0

Ich bin mir nicht ganz sicher, aber ich glaube, das ist das gleiche wie die Verwendung von 'GROUP_CONCAT (DISTINCT CONCAT_WS (':', B.ID, C.Name) ORDER BY 1)'. Was viel einfacher ist, wenn es funktioniert! – Doin

+0

Das hat mir etwas Neues beigebracht, danke! :-) – AMeiri

+0

Ja! Die eigentlich richtige Antwort !!! (Natürlich macht niemand genau das, was das OP ist!) Wir sind auf dieser Seite, weil wir wissen wollen, wie man die Ergebnisse von DISTINCT Func (...) in der Reihenfolge nach referenziert, und die Antwort ist, dass man nur die Func wieder.) – HoldOffHunger

Verwandte Themen