mysql:group by,order by

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql:group by,order by相关的知识,希望对你有一定的参考价值。

参考技术A 表结构如下

order by 默认以升序进行排列

mysql 对于多重排序的处理是从左到右,也就是说先根据条件1进行排序、出现了相同的情况再去执行条件2进行排序

表结构如下

在进行 group 进行分组时,只能显示用于分组的字段

计算出每个分组的个数

对每个分组中数据的 sum 字段进行求和

对每个分组中数据的 avg 字段进行求平均数

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

我明显误解了MySQL的GROUP 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

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

答案

有了这个查询:

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

你可以得到每个order_columnid的最大值。 然后将它加入到表中:

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          |
另一答案

不完全确定你想要完成什么,但你尝试过:

ORDER BY
    GROUP_NAME,
    ORDER_COLUMN

如果这不起作用,那么如何添加具有不同组名的更多数据以及您希望输出看起来像什么的示例

以上是关于mysql:group by,order by的主要内容,如果未能解决你的问题,请参考以下文章

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

mysql group by order by limit 1

mysql ORDER BY和 GROUP BY

MySql Group By 和 order by date

Mysql group by,order by,dinstict优化

MySQL 中的 GROUP BY 中断 ORDER BY 列表