按时间顺序排列一个字段的行,然后按时间顺序排列另一个字段

时间:2014-09-14 08:18:14

标签: mysql sql sql-order-by

如果我们有一个用户登录时记录的表格,

---------------------------------
| 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)不起作用。

我觉得这应该很简单,但我无法理解。有什么建议吗?

1 个答案:

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

An SQLfiddle to test with