如何 select 仅基于特定列值的最后条目保持当前 table 顺序

How to select only last entries based on a especific column value keeping the current table order

我有一个 table 可以跟踪对学生目录中的学生应用的最后更改。我想每分钟 return 来自这个 table 的数据,这样我就可以用我的 java 应用程序只对必要的条目进行 sincronize。

碰巧我只需要每个 ID 的最后一个 event_type 条目。我刚刚创建了一个小艺术来以图形方式解释我想要什么,但是该网站不允许我 post 它因为我的声誉还很低。不过,我会尝试 post 其 link:

What I have                                        What I would like
+---------------------+------------+------------+  +---------------------+------------+------------+
| event_time          | event_type | student_id |  | event_time          | event_type | student_id |
+---------------------+------------+------------+  +---------------------+------------+------------+
| 2015-08-16 11:42:08 |          1 |         37 |  | 2015-08-16 11:44:30 |          1 |         37 |
| 2015-08-16 11:42:29 |          1 |         37 |  | 2015-08-16 11:45:47 |          2 |         37 |
| 2015-08-16 11:43:51 |          2 |         37 |  | 2015-08-16 12:21:40 |          1 |         44 |
| 2015-08-16 11:44:13 |          3 |         37 |  | 2015-08-16 12:21:49 |          3 |         44 |
| 2015-08-16 11:44:30 |          1 |         37 |  | 2015-08-16 12:21:55 |          2 |         30 |
| 2015-08-16 11:45:47 |          2 |         37 |  | 2015-08-16 12:22:00 |          3 |         37 |
| 2015-08-16 12:21:28 |          2 |         44 |  | 2015-08-16 12:27:08 |          2 |         44 |
| 2015-08-16 12:21:40 |          1 |         44 |  +---------------------+------------+------------+
| 2015-08-16 12:21:49 |          3 |         44 |
| 2015-08-16 12:21:55 |          2 |         30 |
| 2015-08-16 12:22:00 |          3 |         37 |
| 2015-08-16 12:27:08 |          2 |         44 |
+---------------------+------------+------------+

知道我该怎么做吗?我搜索了该站点,但找不到任何 suitable 的内容。感谢您的帮助!

select max(time), type, id
from your table
group by type, id

应该可以。如果我理解您的意思,您需要每个(类型,ID)对的最新条目,此查询将检索这些条目。

例如:

SELECT x.* 
  FROM my_table x 
  JOIN my_table y  
    ON y.student_id = x.student_id 
   AND y.event_time >= x.event_time 
 GROUP 
    BY x.student_id
     , x.event_time 
HAVING COUNT(*) <= 3 
 ORDER 
    BY event_time;

或者,更快...

SELECT event_time
     , event_type
     , student_id 
  FROM 
     ( SELECT x.*
            , CASE WHEN @prev = student_id THEN @i := @i + 1 ELSE @i := 1 END i
            , @prev := student_id 
         FROM my_table x
            , (SELECT @i:=1,@prev:='') vars 
        ORDER 
           BY student_id
            , event_time DESC
     ) n 
 WHERE i <= 3
 ORDER 
    BY event_time;