2012-07-19 86 views
1

我正在尋找一個日誌表,以便根據id的第一次出現,按id進行分組。在我下面的例子中,我有一個'測試'表,我想按id對錶進行分組,這樣所有的id都在一起,即列出所有'623'條目,然後列出所有'444'條目。我希望'623'條目先來,因爲第一條'623'記錄出現在第一條'444'條目之前。按時間排序,並基於ID的第一次出現

輸入:

╔═══════╦════════════╦═════╗ 
║ uid ║ time ║ id ║ 
╠═══════╬════════════╬═════╣ 
║ 001 ║ 01:45:10 ║ 623 ║ 
║ 002 ║ 02:45:20 ║ 444 ║ 
║ 003 ║ 03:45:30 ║ 444 ║ 
║ 004 ║ 04:45:40 ║ 623 ║ 
║ 005 ║ 05:45:50 ║ 623 ║ 
║ 006 ║ 06:45:00 ║ 444 ║ 
╚═══════╩════════════╩═════╝ 

輸出:

╔═══════╦════════════╦═════╗ 
║ uid ║ time ║ id ║ 
╠═══════╬════════════╬═════╣ 
║ 001 ║ 01:45:10 ║ 623 ║ 
║ 004 ║ 04:45:40 ║ 623 ║ 
║ 005 ║ 05:45:50 ║ 623 ║ 
║ 002 ║ 02:45:20 ║ 444 ║ 
║ 003 ║ 03:45:30 ║ 444 ║ 
║ 006 ║ 06:45:00 ║ 444 ║ 
╚═══════╩════════════╩═════╝ 

我來最接近的是這樣的:

select time, id from test group by id, time 

    ╔═══════╦════════════╦═════╗ 
    ║ uid ║ time ║ id ║ 
    ╠═══════╬════════════╬═════╣ 
    ║ 002 ║ 02:45:20 ║ 444 ║ 
    ║ 003 ║ 03:45:30 ║ 444 ║ 
    ║ 006 ║ 06:45:00 ║ 444 ║ 
    ║ 001 ║ 01:45:10 ║ 623 ║ 
    ║ 004 ║ 04:45:40 ║ 623 ║ 
    ║ 005 ║ 05:45:50 ║ 623 ║ 
    ╚═══════╩════════════╩═════╝ 

但這不完全是因爲它是由訂購ID。我不確定正確的語法是如何讓所有的'623'條目首先被列出,因爲第一條'623'記錄出現在第一條'444'條目之前。

在此先感謝您的幫助。

得到了答案:

SELECT test.time, test.id FROM 
(
    (SELECT DISTINCT id FROM test ORDER BY time ASC) as distinct_test 
    LEFT JOIN 
    test ON distinct_test.id = test.id 
) 

那現在,我看很有道理。感謝大家的幫助。

+0

我剛剛交了一個答案,然後意識到的東西。你的'身份證'並不鮮明。你可以調整你的例子來包含一個不同的主鍵,然後用一個單獨的字段代替'id'嗎?或者至少只是將'id'重命名爲別的東西? – 2012-07-19 19:17:04

+0

該id值是不是唯一的。如果有幫助,我會在唯一的ID字段中添加。 – DanM7 2012-07-19 20:08:30

+0

是的,我知道。你所做的就是我想要的。謝謝。 – 2012-07-20 02:29:44

回答

1

這是您需要使用的代碼;我在你的數據上測試過它,它工作。這與Jason Swett的基本相同,除了你必須使用LEFT OUTER JOIN而不是RIGHT OUTER JOIN

SELECT t.id, t.time 
FROM (SELECT DISTINCT id 
     FROM `table` 
     ORDER BY time ASC) distinct_t 
LEFT OUTER JOIN `table` t ON distinct_t.id = t.id; 
+0

謝謝傑夫。我實際上嘗試了一個左踢腳踢,它確實做了我想要的,但我仍然會給你答案。 – DanM7 2012-07-19 20:30:34

+0

如果一個正常的左連接起作用,我認爲這個答案和我的實際上是一樣的,只是寫成不同的順序。 – 2012-07-20 02:33:20

+0

我其實在數據上試過你的答案,並沒有產生預期的結果。儘管這是個正確的主意,但我感謝你的回答是基於我的回答。 – jeff 2012-07-20 03:04:33

1

喜歡的東西...

 SELECT test.id, 
      test.time 
     FROM (SELECT DISTINCT id 
       FROM test 
      ORDER BY time ASC) distinct_test 
    RIGHT JOIN test ON distinct_test.id = test.id 

這可能無法正常工作,但它至少可能讓你對你的方式。

1

嗯?

SELECT time, id FROM test group by id, time order by id desc