GROUP_CONCAT изменить порядок GROUP BY - PullRequest
5 голосов
/ 25 марта 2011

У меня есть VIEW (много объединений), который выводит данные, упорядоченные по дате ASC . Работает как положено.

ВЫХОД похож на:

ID date         tag1   other_data
1  25-03-2011   blue   fff   <=
1  26-03-2011   red    ggg
1  27-03-2011   pink   yyy
2  25-03-2011   red    yyy   <=
2  26-03-2011   orange rrr

Если я подам заявку GROUP BY ID. Для других столбцов MySQL выводит первую найденную строку каждого идентификатора. Я читал это где-то в te документах.

SELECT * FROM `myVIEW`  
GROUP BY `ID`  
  ID date         tag1  other_data  
  1  25-03-2011   blue   fff   <=
  2  25-03-2011   red    yyy   <=

Теперь давайте добавим GROUP_CONCAT (tags1)

SELECT *,CONCAT_GROUP(`tag1`) AS `tags`  
FROM `myVIEW`  
GROUP BY `ID`

Поскольку я применяю CONCAT_GROUP, результаты получаются странными. Я ожидал:

ID date         tag1   other_data   tags
1  25-03-2011   blue   fff          blue,red,pink
2  25-03-2011   red    yyy          red,orange

Запрос возвращается, например:

ID date         tag1   other_data   tags
1  26-03-2011   red    ggg          blue,red,pink
2  25-03-2011   red    yyy          red,orange

Похоже, что GROUP_CONCAT больше не сохраняет порядок VIEW. Это нормально?

Ответы [ 3 ]

5 голосов
/ 25 марта 2011

Похоже, GROUP_CONCAT больше не сохраняет порядок просмотра. Это нормально?

Да, это нормально.

Вы никогда не должны полагаться на порядок, в котором возвращаются несгруппированные и неагрегированные поля.

GROUP_CONCAT имеет свое собственное предложение ORDER BY, которое оптимизатор учитывает и может изменить порядок, в котором выполняется анализ записей.

Чтобы вернуть первую запись вместе с GROUP_CONCAT, используйте это:

SELECT  m.*, gc
FROM    (
        SELECT  id, MIN(date) AS mindate, GROUP_CONCAT(tags) AS gc
        FROM    myview
        GROUP BY
                id
        ) md
JOIN    m.*
ON      m.id = md.id
        AND m.date = md.mindate
5 голосов
/ 18 октября 2011

Как насчет заказа вашего GROUP_CONCAT?

SELECT value1, GROUP_CONCAT(value1 ORDER BY date DESC)   
FROM table1  
GROUP BY value1;

Это синтаксис, который вам нужен.

1 голос
/ 25 марта 2011

Это потому, что mysql не гарантирует, какие именно строки будут возвращены для полей, которые не используются в функциях агрегации или не использовались для группировки.

И для ясности "зрелые" rdbms (такие как postgre, sql server, oracle) не позволяют указывать * в GROUP BY (или любые поля без агрегации или которые не были указаны в GROUP BY) - и это большое «ограничение».

...