web-dev-qa-db-ja.com

通常の方法ではなく、2列で注文したい

以下のようなテーブルがあります

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

日付が昇順のユーザーが最初に来て、テーブル内の同じユーザーレコードが彼の最初のレコードの後に​​続く必要があります...

5
Rajeev Vyas
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;
4
gbn

このクエリでうまくいくと思います

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)

試してみる !!!

4
RolandoMySQLDBA

これはあなたが探していることをしますか?これは、userIDとDateによる並べ替えにすぎません。

select ID, userID, Date
from Table
order by userID, Date
0
dmc