2009-10-16 15 views
20

Chcę zamówić wyniki w funkcji GROUP_CONCAT. Problemem jest to, że wybór w GROUP_CONCAT funkcją jest inna funkcja, jak ten (fantasy wybrać):Zamawianie w MySQL GROUP_CONCAT z funkcją w nim

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 

Chcę uzyskać wynik podobny (uporządkowane według b.id):

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

ale otrzymuję:

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

Czy ktoś wie jak mogę zamówić przez b.id w moim GROUP_CONCAT tutaj?

+2

[GROUP_CONCAT] (http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat) obsługuje własny 'ZAMÓW Klauzula BY ... Nie wiedząc, co funkcja zdefiniowana przez użytkownika jest lub nie pomoże, nie będzie w stanie Ci pomóc. –

+0

To tak jak napisałem: funkcja "concat_ws" w ramach funkcji "group_concat". Nigdy nie powiedziałem, że jest to funkcja zdefiniowana przez użytkownika. – acme

+0

Nie jest jasne, jak napisać prawidłowe rozwiązanie, ponieważ struktura tabeli, zawartość i relacje między tabelami są nieokreślone (tj. Nie ma specyfikacji łączenia). – outis

Odpowiedz

37

Jeśli ktoś dba, myślę, że znalazłem rozwiązanie dla co najmniej podobnym problemem.

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 

Kolejność przez idzie w GROUP_CONCAT PRZED separatora, jeśli taki istnieje.

+0

Dobre znalezisko !! Dzięki za udostępnienie! – rckehoe

+0

Awesome, This one saved my life – Nadeeshaan

+0

Nice one! Thanks for sharing –

2

Nie znam standardowego sposobu, aby to zrobić. Ta kwerenda działa, ale obawiam się, że to po prostu zależy od pewnych szczegółach realizacji:

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

Po krótkich badaniach wydaje się, że to o co proszę nie jest możliwe. Mimo to dziękuję! – acme

+0

próbowałem tego, jakoś nie działa – 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

Chcę zamówić zagregowane elementy w 'GROUP_CONCAT', a nie całe wyniki. – 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

Nie trzeba wybierać podselekcji.

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

wiem, że to jest bardzo stary, ale właśnie szukałem odpowiedzi na odpowiedź i @ korny dał mi pomysł na to:

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 

(A to działa na mnie, jeśli to nie było jasne :-))

+0

Nie jestem absolutnie pewny, ale uważam, że jest to to samo, co użycie 'GROUP_CONCAT (DISTINCT CONCAT_WS (':', b.id, c.name) ORDER BY 1)'. Co jest znacznie prostsze, jeśli działa! – Doin

+0

To nauczyło mnie czegoś nowego, dzięki! :-) – AMeiri

+0

Tak! Właściwie poprawna odpowiedź !!! (Oczywiście nikt nie robi dokładnie tego, co jest OP! Jesteśmy na tej stronie, ponieważ chcemy wiedzieć, jak odwołać się do wyników DISTINCT Func (...) w kolejności według, a odpowiedź brzmi: wystarczy zadzwonić Funk ponownie.) – HoldOffHunger