MySQL, использующий ПОРЯДОК по сгруппированным (GROUP BY) результатам

#mysql #group-by #sql-order-by

#MySQL #группировка по #sql-order-by

Вопрос:

Я явно что-то неправильно понимаю здесь с ГРУППОЙ MySQL BY, поскольку она меняет порядок моих результатов.

Используя этот пример данных SQL:

     CREATE TABLE IF NOT EXISTS `example_table` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `GROUP_NAME` text NOT NULL,
      `ORDER_COLUMN` int(11) NOT NULL,
      PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;



    INSERT INTO `example_table` (`ID`, `GROUP_NAME`, `ORDER_COLUMN`) VALUES
    (NULL, '271007K240.003:10', 70),
    (NULL, '271007K240.003:10', 90),
    (NULL, '271007K240.003:10', 100),
    (NULL, '271007K240.003:10', 50),
    (NULL, '271007K240.003:10', 80),
   (NULL, '271007K240.003:10', 60);
 

Теперь я создал эти данные в качестве примера, чтобы в столбце GROUP_NAME было много разных значений., но для clairty я просто включил то, что демонстрирует проблему.

Выполнение этого очень простого запроса возвращает самый высокий ORDER_COLUMN (ID: 3) вверху, как и ожидалось:

 SELECT
    *
FROM
    `example_table`
ORDER BY
    ORDER_COLUMN
DESC
 

Однако я действительно хотел сгруппировать по столбцу, который я назвал здесь GROUP_NAME, поэтому, имея это в виду, я собирался сделать что-то вроде этого:

 SELECT
    *
FROM
    `example_table`
GROUP BY
    GROUP_NAME
ORDER BY
    ORDER_COLUMN
DESC
 

Теперь выполнение этого просто возвращает первую строку и игнорирует ORDER BY.

Затем я подумал, что для достижения того, что мне нужно, мне нужно будет использовать вложенный запрос с предварительно отсортированными данными, а затем group by может просто сгруппировать набор данных вложенных запросов следующим образом:

 SELECT
    *
FROM
    (
    SELECT
        *
    FROM
        `example_table`
    ORDER BY
        ORDER_COLUMN
    DESC
) AS TEMP_TABLE

GROUP BY GROUP_NAME
 

К сожалению, это по-прежнему возвращает только первую строку таблицы. Что я здесь делаю не так?

Комментарии:

1. Чего именно вы пытаетесь достичь с помощью этого GROUP BY пункта?

2. Прочтите это: dev.mysql.com/doc/refman/5.7/en/group-by-handling.html и пересмотрите то, чего именно вы хотите.

Ответ №1:

С помощью этого запроса:

 select group_name, max(order_column) order_column
from example_table
group by group_name
 

вы можете получить максимальное значение order_column для каждого id из них.
Затем присоедините его к столу:

 select t.* 
from example_table t inner join ( 
  select group_name, max(order_column) order_column
  from example_table
  group by group_name
) g on g.group_name = t.group_name and g.order_column = t.order_column
 

Посмотрите демонстрационную версию.
Результаты:

 | ID  | GROUP_NAME        | ORDER_COLUMN |
| --- | ----------------- | ------------ |
| 3   | 271007K240.003:10 | 100          |
 

Ответ №2:

Не совсем уверен, чего вы хотите достичь, но вы пробовали:

 ORDER BY
    GROUP_NAME,
    ORDER_COLUMN
 

Если это не поможет, как насчет добавления дополнительных данных с разными именами групп и примером того, как вы ожидаете, что результат будет выглядеть

Комментарии:

1. Спасибо за ответ. Добавив этот пример, показанный выше, Т.Е. сгруппировав поле, в котором я был, я получил сообщение об ошибке из-за того, что оно не является агрегированными данными. Теперь, при группировке, конечная игра должна быть установлена здесь: db-fiddle.com/f/poNVD1jUkdL4eNqfPqVgQW/0 Итак, в этом примере я добавил две группы, используя GROUP BY, я надеялся, что смогу получить только 2 строки из базы данных, по одной для каждой из групп. То, что я хочу получить, — это строки с наивысшими значениями ORDER_COLUMN, поэтому я пытаюсь ГРУППИРОВАТЬ и УПОРЯДОЧИВАТЬ вместе.