我有一张如下表
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)
这不是我想要的,我希望日期升序的用户应该先出现,表中的相同用户记录应该跟随他的第一条记录......
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)
我认为这个查询会为你做
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)
试一试 !!!
归档时间: |
|
查看次数: |
13979 次 |
最近记录: |