按时间排序表并基于ID的首次出现

时间:2012-07-19 18:59:31

标签: mysql group-by sql-order-by

我正在寻找一个日志表,以便根据id的第一个外观按ID进行分组。在下面的示例中,我有一个表'test',我想按ID对表进行分组,以便所有ID都在一起,即列出所有'623'条目,然后列出所有'444'条目。我希望'623'条目首先出现,因为第一个'623'记录出现在第一个'444'条目之前。

输入:

╔═══════╦════════════╦═════╗
║  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
)

现在我明白这是有道理的。谢谢大家的帮助。

3 个答案:

答案 0 :(得分: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 :(得分:1)

嗯?

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

答案 2 :(得分: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;