Заказ в MySQL GROUP_CONCAT с функцией в нем

Я хочу упорядочить результаты в функции GROUP_CONCAT. Проблема в том, что выбор в функции GROUP_CONCAT — это другая функция, вроде этой (фантазийный выбор):

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

Я хочу получить такой результат (заказанный по b.id):

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

но я получаю:

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

Кто-нибудь знает, как я могу заказать здесь по b.id в моей группе group_concat?


person acme    schedule 16.10.2009    source источник
comment
GROUP_CONCAT поддерживает собственные ORDER BY пункт... Незнание того, что представляет собой определяемая пользователем функция или что она делает, не поможет нам помочь вам.   -  person OMG Ponies    schedule 19.06.2011
comment
Как я и написал: функция concat_ws внутри функции group_concat. Я никогда не говорил, что это определяемая пользователем функция.   -  person acme    schedule 20.06.2011
comment
Неясно, как написать правильное решение, поскольку структура таблицы, содержимое и отношения между таблицами не определены (т. е. нет спецификаций соединения).   -  person outis    schedule 01.02.2013
comment
Потому что нет необходимости отвечать на этот вопрос.   -  person acme    schedule 07.02.2013
comment
@acme Мог бы пометить мой ответ как правильный, если это правильный ответ? Кажется, это очень полезно для других.   -  person Jazzy    schedule 12.06.2014


Ответы (5)


Если кому интересно, я думаю, что нашел решение, по крайней мере, для аналогичной проблемы.

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

Порядок идет в group_concat ПЕРЕД разделителем, если он есть.

person Jazzy    schedule 03.11.2012

Я знаю, что это действительно старо, но только сейчас я искал ответ, и ответ @korny дал мне идею для этого:

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

(И это работает для меня, если это было не ясно :-))

person AMeiri    schedule 04.11.2015
comment
Я не совсем уверен, но я считаю, что это то же самое, что и использование GROUP_CONCAT(DISTINCT CONCAT_WS(':', b.id, c.name) ORDER BY 1). Что намного проще, если это работает! - person Doin; 08.12.2015
comment
Да! Собственно-правильный ответ!!! (Конечно, никто не делает именно то, что OP! Мы на этой странице, потому что хотим знать, как ссылаться на результаты DISTINCT Func(...) в Order By, и ответ: вам просто нужно вызвать Опять фанк.) - person HoldOffHunger; 18.07.2016

Я не знаю стандартного способа сделать это. Этот запрос работает, но я боюсь, что это просто зависит от некоторых деталей реализации:

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
person Lukáš Lalinský    schedule 16.10.2009
comment
После небольшого исследования кажется, что то, что я прошу, невозможно. Тем не менее спасибо! - person acme; 19.10.2009

Нет необходимости в подзапросах.

SELECT people.name, CONCAT_WS(":", stuff.id, courses.name) data
FROM people, stuff, courses
ORDER BY stuff.id, people.name
person Sandro Frattura    schedule 22.01.2014

person    schedule
comment
Я хочу упорядочить агрегированные элементы В GROUP_CONCAT, а не все результаты. - person acme; 04.04.2012