如果我们有一个在用户登录时记录的表,
---------------------------------
| user | time |
---------------------------------
| Jill | 2014-09-13 21:04:36 |
| Jack | 2014-09-13 21:06:43 |
| Jack | 2014-09-13 21:09:13 |
| Jack | 2014-09-13 21:12:23 |
| Jill | 2014-09-13 21:13:41 |
---------------------------------
我们希望按用户首先登录的行进行排序,然后按时间排序该用户随后的每次登录,
---------------------------------
| user | time |
---------------------------------
| Jill | 2014-09-13 21:04:36 |
| Jill | 2014-09-13 21:13:41 |
| Jack | 2014-09-13 21:06:43 |
| Jack | 2014-09-13 21:09:13 |
| Jack | 2014-09-13 21:12:23 |
---------------------------------
我们如何编写 ORDER BY
子句来做到这一点?
如果我们使用ORDER BY name, time
,那么我们会根据名称的字母顺序在Jill
之前得到Jack
。
---------------------------------
| user | time |
---------------------------------
| Jack | 2014-09-13 21:06:43 |
| Jack | 2014-09-13 21:09:13 |
| Jack | 2014-09-13 21:12:23 |
| Jill | 2014-09-13 21:04:36 |
| Jill | 2014-09-13 21:13:41 |
---------------------------------
如果我们使用ORDER BY time, name
,那么我们只需按照他们登录的顺序混合名称即可。
---------------------------------
| user | time |
---------------------------------
| Jill | 2014-09-13 21:04:36 |
| Jack | 2014-09-13 21:06:43 |
| Jack | 2014-09-13 21:09:13 |
| Jack | 2014-09-13 21:12:23 |
| Jill | 2014-09-13 21:13:41 |
---------------------------------
我们可以使用SELECT DISTINCT name FROM table
来仅按时间顺序获取名称,然后以某种方式获取其余行......但是如何在一个查询中做到这一点?有没有办法在 ORDER BY 子句中执行子查询? ORDER BY (SELECT DISTINCT name FROM table)
不起作用。
我觉得这应该很简单,但我无法弄清楚。有什么建议吗?
最佳答案
您可以加入一个子查询,该子查询获取用户的最短登录时间,然后按该时间进行排序。如果两个用户首次登录时间相同,则需要按a.user排序,以免结果混淆。
SELECT a.*
FROM table1 a
JOIN ( SELECT user, MIN(time) min_time FROM table1 GROUP BY user) b
ON a.user=b.user
ORDER BY b.min_time, a.user, a.time
关于mysql - 按一个字段的时间顺序对行进行排序,然后按另一字段的时间顺序对行进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25831358/