想要在两列上订购但不是通常的方式

Raj*_*yas 5 mysql order-by

我有一张如下表

ID  userID  Date
1   2273    22/08/2011
2   2274    24/08/2011
3   2275    26/08/2011
4   2273    26/08/2011
5   2273    26/08/2011
6   2271    26/08/2011
Run Code Online (Sandbox Code Playgroud)

并希望结果如下。需要 mysql 查询帮助来实现这一点。基本上我想按日期订购,但同一个用户必须都在一起。我试图在单个查询中实现这一点。

ID  userID  Date
1   2273    22/08/2011
4   2273    26/08/2011
5   2273    26/08/2011
2   2274    24/08/2011
3   2275    26/08/2011
6   2271    26/08/2011
Run Code Online (Sandbox Code Playgroud)

我尝试按 userId,Date 从 mytable order 中选择 * 并将导致以下结果

ID  userID  Date
6   2271    26/08/2011
1   2273    22/08/2011
4   2273    26/08/2011
5   2273    26/08/2011
2   2274    24/08/2011
3   2275    26/08/2011
Run Code Online (Sandbox Code Playgroud)

这不是我想要的,我希望日期升序的用户应该先出现,表中的相同用户记录应该跟随他的第一条记录......

gbn*_*gbn 5

SELECT *
FROM Mytable
ORDER BY
   userID, Date
Run Code Online (Sandbox Code Playgroud)

我认为 Date 真的是一个日期/时间类型而不是 varchar ...

编辑,澄清后:

未经测试

SELECT
    M.*
FROM
    ( --one row for each user
    SELECT MIN(Date) AS FirstUserDate, userID
    FROM MyTable
    GROUP BY userID
    ) foo
    JOIN
    MyTable M ON foo.userID = M.userID
ORDER BY
    foo.FirstUserDate, M.userID, M.Date;
Run Code Online (Sandbox Code Playgroud)


Rol*_*DBA 5

我认为这个查询会为你做

SELECT A.*
FROM userorder A LEFT JOIN 
(SELECT * FROM userorder
WHERE userID=
(SELECT MIN(userID) FROM userorder
WHERE Date=(SELECT MAX(Date)
FROM userorder ORDER BY userID))) B
USING (ID)
ORDER BY IFNULL(B.ID,-1),userId,Date;
Run Code Online (Sandbox Code Playgroud)

我实际上使用了您的示例数据并在我的 PC 上的 MySQL 5.5.12 中进行了尝试

mysql> use test
Database changed
mysql> DROP TABLE IF EXISTS userorder;
Query OK, 0 rows affected (0.03 sec)

mysql> CREATE TABLE userorder (ID int,userID int,Date date);
Query OK, 0 rows affected (0.16 sec)

mysql> INSERT INTO userorder VALUES
    -> (1,2273,'2011-08-22'),
    -> (2,2274,'2011-08-24'),
    -> (3,2275,'2011-08-26'),
    -> (4,2273,'2011-08-26'),
    -> (5,2273,'2011-08-26'),
    -> (6,2271,'2011-08-26');
Query OK, 6 rows affected (0.05 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM userorder;
+------+--------+------------+
| ID   | userID | Date       |
+------+--------+------------+
|    1 |   2273 | 2011-08-22 |
|    2 |   2274 | 2011-08-24 |
|    3 |   2275 | 2011-08-26 |
|    4 |   2273 | 2011-08-26 |
|    5 |   2273 | 2011-08-26 |
|    6 |   2271 | 2011-08-26 |
+------+--------+------------+
6 rows in set (0.00 sec)

mysql> SELECT A.*
    -> FROM userorder A LEFT JOIN
    -> (SELECT * FROM userorder
    -> WHERE userID=
    -> (SELECT MIN(userID) FROM userorder
    -> WHERE Date=(SELECT MAX(Date)
    -> FROM userorder ORDER BY userID))) B
    -> USING (ID)
    -> ORDER BY IFNULL(B.ID,-1),userId,Date;
+------+--------+------------+
| ID   | userID | Date       |
+------+--------+------------+
|    1 |   2273 | 2011-08-22 |
|    4 |   2273 | 2011-08-26 |
|    5 |   2273 | 2011-08-26 |
|    2 |   2274 | 2011-08-24 |
|    3 |   2275 | 2011-08-26 |
|    6 |   2271 | 2011-08-26 |
+------+--------+------------+
6 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

试一试 !!!