我想订购一个日志表,以便根据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”记录出现在第一个“444”条目之前,所以将所有“623”条目列在第一个。
提前谢谢你的帮助。
得到答案:
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
)

我现在明白了。谢谢大家的帮助。

最佳答案

这是您需要使用的代码;我在您的数据上测试了它,它成功了。它与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;

关于mysql - 根据时间并根据ID的首次出现顺序排列表格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11567528/

10-15 21:23
查看更多