2009-10-16 15 views
20

Desidero ordinare i risultati in una funzione GROUP_CONCAT. Il problema è, che la selezione nel group_concat-funzione è un'altra funzione, come questo (fantasia selezionare):Ordinamento in un GRUPPO_CONCAT MySQL con una funzione in esso

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 

voglio ottenere un risultato simile (in ordine di b.id):

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

ma ottengo:

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

qualcuno sa come posso ordinare dal b.id nella mia group_concat qui?

+2

[GROUP_CONCAT] (http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat) supporta il proprio 'ORDINE Clausola BY' ... Non sapere quale sia la funzione definita dall'utente, o cosa, non ci aiuterà a essere in grado di aiutarti. –

+0

È proprio come ho scritto: la funzione "concat_ws" all'interno della funzione "group_concat". Non ho mai detto che fosse una funzione definita dall'utente. – acme

+0

Non è chiaro come scrivere una soluzione valida, in quanto la struttura della tabella, il contenuto e le relazioni tra le tabelle non sono specificati (cioè non ci sono specifiche di join). – outis

risposta

37

se qualcuno avesse voglia, penso di aver trovato una soluzione per almeno un problema simile.

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 

L'ordine dal va nella group_concat prima del separatore se presente.

+0

Buona scoperta !! Grazie per la condivisione! – rckehoe

+0

Impressionante, Questo mi ha salvato la vita – Nadeeshaan

+0

Bello! Grazie per aver condiviso –

2

Non conosco un modo standard per farlo. Questa query funziona, ma ho paura dipende solo da qualche dettaglio di implementazione:

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

Dopo una piccola ricerca sembra che ciò che chiedo non sia possibile. Grazie comunque! – acme

+0

provato questo, in qualche modo non funziona – 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

Voglio ordinare gli elementi aggregati nel 'GROUP_CONCAT' non i risultati completi. – 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

Nessuna necessità di sottoselezioni.

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

So che questo è molto vecchio, ma solo ora che cercavo risposta una risposta e di @ KoRnY mi ha dato l'idea per questo:

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 

(e funziona per me, se questo non era chiaro :-))

+0

Non ne sono assolutamente sicuro, ma credo che sia lo stesso che usare 'GROUP_CONCAT (DISTINCT CONCAT_WS (':', b.id, c.name) ORDINA PER 1)'. Il che è molto più semplice, se funziona! – Doin

+0

Questo mi ha insegnato qualcosa di nuovo, grazie! :-) – AMeiri

+0

Sì! La risposta effettivamente corretta !!! (Naturalmente nessuno sta facendo esattamente quello che l'OP è! Siamo su questa pagina perché vogliamo sapere come fare riferimento ai risultati di DISTINCT Func (...) nell'Ordine di, e la risposta è che devi solo chiamare il Func di nuovo.) – HoldOffHunger

Problemi correlati