如果我们有一个用户登录时记录的表格,
---------------------------------
| 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
,那么我们会根据字母的名称在Jack
之前得到Jill
。
---------------------------------
| 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)
不起作用。
我觉得这应该很简单,但我无法理解。有什么建议吗?
答案 0 :(得分:1)
您可以使用子查询加入,该子查询获取用户的最短日志时间,并按此顺序排序。如果两个用户具有相同的首次登录时间,则需要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