MySQL在分组(GROUP BY)结果上使用ORDER BY

时间:2019-04-14 13:36:05

标签: mysql group-by sql-order-by

我显然误解了MySQL的GROUP BY,因为它改变了我的结果顺序。

使用以下示例SQL数据:

\b

现在,我以创建此数据为例,因此 GROUP_NAME 列中会有很多不同的值。但是,为了聪明起见,我只包含了演示此问题的内容。

运行此非常简单的查询,按预期方式在顶部返回最高的 ORDER_COLUMN (ID:3)

    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 进行分组,因此我想做这样的事情:

SELECT
    *
FROM
    `example_table`
ORDER BY
    ORDER_COLUMN
DESC

现在执行此操作仅返回第一行,而忽略ORDER BY。

然后我想实现我所需要的,我将需要使用对数据进行预排序的子查询,然后group by可以像这样对子查询数据集进行分组:

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

但是,不幸的是,它仍然仅返回表的第一行。我在这里做什么错了?

2 个答案:

答案 0 :(得分: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

请参见demo
结果:

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

答案 1 :(得分:0)

不确定要完成什么,但是您尝试过:

ORDER BY
    GROUP_NAME,
    ORDER_COLUMN

如果这不能解决问题,如何添加具有不同组名的更多数据以及如何显示输出示例