MySQL 分组查询取前N条

一些说明

MySQL 中通过 GROUP BY 进行分组查询,只会在每个组中出现一条数据。这一条数据并不是从改组中随机抽取的,而是该组结果的第一条数据。

表结构

1
2
3
4
5
6
7
8
9
10
11
12
mysql> DESC PRODUCT_ORDER;
+---------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------------+------+-----+---------+-------+
| ID | varchar(255) | NO | PRI | NULL | |
| PRODUCT_CODE | varchar(20) | YES | | NULL | |
| PRODUCT_PRICE | decimal(10,2) | YES | | NULL | |
| PRODUCT_COUNT | varchar(255) | YES | | NULL | |
| CREATE_DATE | date | YES | | NULL | |
| CREATE_TIME | datetime | YES | | NULL | |
+---------------+---------------+------+-----+---------+-------+
6 rows in set

表数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT * FROM PRODUCT_ORDER;
+--------------------------+--------------+---------------+---------------+-------------+---------------------+
| ID | PRODUCT_CODE | PRODUCT_PRICE | PRODUCT_COUNT | CREATE_DATE | CREATE_TIME |
+--------------------------+--------------+---------------+---------------+-------------+---------------------+
| 312d9a34cee332176b3aae30 | SN | 106.18 | 8 | 2017-07-01 | 2017-07-01 16:12:09 |
| 40fb7a2feb0a8c4172bf7db1 | NJY | 122.51 | 8 | 2017-07-01 | 2017-07-01 09:32:33 |
| 4feac4f4d90958b26aa9ae7d | HWCX | 131.07 | 3 | 2017-07-04 | 2017-07-04 05:10:35 |
| 667a753557f7af9409632302 | RYCW | 97.44 | 1 | 2017-07-01 | 2017-07-01 05:11:14 |
| 66a4abaf56c46334f5fd481d | DDYX | 144 | 7 | 2017-07-02 | 2017-07-02 10:24:24 |
| 969c63845233437a98a0f617 | LSWXTD | 149.08 | 3 | 2017-07-02 | 2017-07-02 22:16:28 |
| a85ffc7a8982389f014b0a73 | DKX | 76.13 | 9 | 2017-07-05 | 2017-07-05 17:57:32 |
| d2230635b2a9b9e97479d576 | XM | 92.75 | 10 | 2017-07-04 | 2017-07-04 19:58:31 |
| d2ebe8d4366fc4fe3e756eb6 | MJSDJQR | 98 | 10 | 2017-07-03 | 2017-07-03 12:56:36 |
| d4a32009bdfbc38ab325f540 | ZNSH | 61.76 | 2 | 2017-07-02 | 2017-07-02 04:47:28 |
+--------------------------+--------------+---------------+---------------+-------------+---------------------+

统计每天的订单数量(分组统计)

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT CREATE_TIME, COUNT(*) FROM PRODUCT_ORDER GROUP BY CREATE_DATE;
+---------------------+----------+
| CREATE_TIME | COUNT(*) |
+---------------------+----------+
| 2017-07-01 16:12:09 | 3 |
| 2017-07-02 10:24:24 | 3 |
| 2017-07-03 12:56:36 | 1 |
| 2017-07-04 05:10:35 | 2 |
| 2017-07-05 17:57:32 | 1 |
+---------------------+----------+
5 rows in set

每天的第一笔订单(分组排序)

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT * FROM (SELECT * FROM PRODUCT_ORDER ORDER BY CREATE_TIME DESC) PO GROUP BY CREATE_DATE;
+--------------------------+--------------+---------------+---------------+-------------+---------------------+
| ID | PRODUCT_CODE | PRODUCT_PRICE | PRODUCT_COUNT | CREATE_DATE | CREATE_TIME |
+--------------------------+--------------+---------------+---------------+-------------+---------------------+
| 312d9a34cee332176b3aae30 | SN | 106.18 | 8 | 2017-07-01 | 2017-07-01 16:12:09 |
| 969c63845233437a98a0f617 | LSWXTD | 149.08 | 3 | 2017-07-02 | 2017-07-02 22:16:28 |
| d2ebe8d4366fc4fe3e756eb6 | MJSDJQR | 98 | 10 | 2017-07-03 | 2017-07-03 12:56:36 |
| d2230635b2a9b9e97479d576 | XM | 92.75 | 10 | 2017-07-04 | 2017-07-04 19:58:31 |
| a85ffc7a8982389f014b0a73 | DKX | 76.13 | 9 | 2017-07-05 | 2017-07-05 17:57:32 |
+--------------------------+--------------+---------------+---------------+-------------+---------------------+
5 rows in set

每天的前两笔订单(分组查询取前 N 条)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SELECT * FROM PRODUCT_ORDER A
-> WHERE 2 > (SELECT COUNT(*) FROM PRODUCT_ORDER B WHERE A.ID > B.ID AND A.CREATE_DATE = B.CREATE_DATE)
-> ORDER BY CREATE_TIME DESC;
+--------------------------+--------------+---------------+---------------+-------------+---------------------+
| ID | PRODUCT_CODE | PRODUCT_PRICE | PRODUCT_COUNT | CREATE_DATE | CREATE_TIME |
+--------------------------+--------------+---------------+---------------+-------------+---------------------+
| a85ffc7a8982389f014b0a73 | DKX | 76.13 | 9 | 2017-07-05 | 2017-07-05 17:57:32 |
| d2230635b2a9b9e97479d576 | XM | 92.75 | 10 | 2017-07-04 | 2017-07-04 19:58:31 |
| 4feac4f4d90958b26aa9ae7d | HWCX | 131.07 | 3 | 2017-07-04 | 2017-07-04 05:10:35 |
| d2ebe8d4366fc4fe3e756eb6 | MJSDJQR | 98 | 10 | 2017-07-03 | 2017-07-03 12:56:36 |
| 969c63845233437a98a0f617 | LSWXTD | 149.08 | 3 | 2017-07-02 | 2017-07-02 22:16:28 |
| 66a4abaf56c46334f5fd481d | DDYX | 144 | 7 | 2017-07-02 | 2017-07-02 10:24:24 |
| 312d9a34cee332176b3aae30 | SN | 106.18 | 8 | 2017-07-01 | 2017-07-01 16:12:09 |
| 40fb7a2feb0a8c4172bf7db1 | NJY | 122.51 | 8 | 2017-07-01 | 2017-07-01 09:32:33 |
+--------------------------+--------------+---------------+---------------+-------------+---------------------+
8 rows in set