MySQL 在Limit后再分组排序

MySQL 在Limit后再分组排序

MySQL是一种流行的关系型数据库管理系统,它允许我们以不同的方式检索和组织数据。在实际工作场景中,我们经常需要按照一定的条件获取特定的数据,这时候limit和order by语句就显得非常重要了。本文将重点探讨在使用limit和order by语句时,如何对结果进行再分组排序。

阅读更多:MySQL 教程

Limit和Order by的基本用法

在MySQL中,limit语句用于限制返回的结果集的大小,我们可以指定返回结果的起始位置和数量。例如,以下语句将从employees表中返回前10条记录:

SELECT * FROM employees LIMIT 10;

而order by语句用于按照指定的列对结果集进行排序,默认为升序排列。例如,以下语句将按照last_name列对employees表进行排序:

SELECT * FROM employees ORDER BY last_name;

我们也可以使用DESC关键字来指定降序排列:

SELECT * FROM employees ORDER BY last_name DESC;

在分组之后order by

假设我们有一个orders表,其中每行记录表示一个订单,有以下字段:id, order_number, customer_id, order_date, amount。我们想要从orders表中查询每个客户最近的订单,并按照订单日期进行排序,我们可以这样写:

SELECT customer_id, order_number, MAX(order_date) AS latest_order_date
FROM orders
GROUP BY customer_id
ORDER BY latest_order_date DESC;

这条SQL语句会先根据customer_id分组,然后计算每个分组中最大的order_date,最后按照最大的order_date进行排序。这样我们就能够获得每个客户最近的订单,并按照订单日期排序,得到如下的结果:

+-------------+--------------+--------------------+
| customer_id | order_number | latest_order_date  |
+-------------+--------------+--------------------+
| 1           | 1001         | 2022-06-01         |
| 2           | 1009         | 2022-05-23         |
| 3           | 1006         | 2022-04-11         |
+-------------+--------------+--------------------+

在这个例子中,我们已经在分组之后使用了order by,它可以正常工作并按照latest_order_date进行排序。但是,如果我们想要获取每个客户最近的两个订单呢?我们可以这样写:

SELECT customer_id, order_number, order_date
FROM (
  SELECT customer_id, order_number, order_date, 
    ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC) AS row_num
  FROM orders
) AS t
WHERE row_num <= 2
ORDER BY customer_id, order_date;

这条SQL语句使用了子查询和窗口函数ROW_NUMBER(),将每个客户的订单按照order_date进行降序排列,并为每个订单分配一个行号。然后,在外部查询中,我们只选择每个客户的前两个订单,并按照customer_id和order_date进行排序,得到以下结果:

+-------------+--------------+-----------+
| customer_id | order_number | order_date |
+-------------+--------------+-----------+
| 1           | 1003         | 2022-08-12|
| 1           | 1001         | 2022-06-01|
| 2           | 1009         | 2022-05-23|
| 2           | 1002         | 2022-03-15|
| 3           | 1006         | 2022-04-11|
| 3           | 1005         | 2022-01-18|
+-------------+--------------+-----------+

总结

在MySQL中,limit和order by语句是非常常见的用法,在实际工作中也会发现各种各样的场景需要使用。但是,当我们在分组后再排序时,需要注意的是,如果希望对每个分组进行排序,我们需要使用子查询和窗口函数来实现。通过本文的介绍,相信大家已经掌握了在MySQL中分组后再排序的基本用法,希望本文能够对大家学习和工作有所帮助。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程