MySQL с использованием ORDER BY по группированным (GROUP BY) результатам - PullRequest
0 голосов
/ 14 апреля 2019

Я явно недопонимаю что-то здесь с GROUP BY MySQL, поскольку это меняет порядок моих результатов.

Используя этот пример данных 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 было много разных значений, но для разряда я только что включил то, что демонстрирует проблему.

Выполнение этого очень простого запроса возвращает самое высокое значение 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.

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

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

GROUP BY GROUP_NAME

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

Ответы [ 2 ]

1 голос
/ 14 апреля 2019

С этим запросом:

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          |
0 голосов
/ 14 апреля 2019

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

ORDER BY
    GROUP_NAME,
    ORDER_COLUMN

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

...