如何 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;
我有一个 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;