2012-07-19 85 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