以下のようなテーブルがあります
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
そして以下のような結果が欲しい。これを達成するには、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
Usertable、Dateでmytableの順序から*を選択しようとすると、次のようになります
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
日付が昇順のユーザーが最初に来て、テーブル内の同じユーザーレコードが彼の最初のレコードの後に続く必要があります...
SELECT *
FROM Mytable
ORDER BY
userID, 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;
このクエリでうまくいくと思います
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;
私は実際にサンプルデータを使用して、私の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)
試してみる !!!
これはあなたが探していることをしますか?これは、userIDとDateによる並べ替えにすぎません。
select ID, userID, Date
from Table
order by userID, Date