1. ホーム
  2. mysql

[解決済み] ユーザーごとに最新の日付の行を選択する

2022-04-29 22:37:37

質問

ユーザーのチェックインとアウトの時間を表すテーブル("lms_attendance")があるのですが、以下のような感じです。

id  user    time    io (enum)
1   9   1370931202  out
2   9   1370931664  out
3   6   1370932128  out
4   12  1370932128  out
5   12  1370933037  in

このテーブルのビューを作成して、ユーザーIDごとに最新のレコードのみを出力し、"in" または "out" の値を与えるようなものを作成しようとしています。

id  user    time    io
2   9   1370931664  out
3   6   1370932128  out
5   12  1370933037  in

今のところ、かなり近づいていますが、viewsがサブクエリを受け付けないことに気づき、かなり難しくなっています。一番近いクエリは:

select 
    `lms_attendance`.`id` AS `id`,
    `lms_attendance`.`user` AS `user`,
    max(`lms_attendance`.`time`) AS `time`,
    `lms_attendance`.`io` AS `io` 
from `lms_attendance` 
group by 
    `lms_attendance`.`user`, 
    `lms_attendance`.`io`

しかし、私が得るものは、:

id  user    time    io
3   6   1370932128  out
1   9   1370931664  out
5   12  1370933037  in
4   12  1370932128  out

これは近いですが、完璧ではありません。最後のgroup byはあってはならないものですが、これがないと、最新の時刻を返しますが、相対的なIO値ではありません。

何かアイデアはありますか? ありがとうございます。

解決方法は?

クエリを実行します。

SQLFIDDLEExample

SELECT t1.*
FROM lms_attendance t1
WHERE t1.time = (SELECT MAX(t2.time)
                 FROM lms_attendance t2
                 WHERE t2.user = t1.user)

結果

| ID | USER |       TIME |  IO |
--------------------------------
|  2 |    9 | 1370931664 | out |
|  3 |    6 | 1370932128 | out |
|  5 |   12 | 1370933037 |  in |

もし、あるユーザーが同じ最大時間を持つ複数のレコードを持っている場合、上記のクエリは複数のレコードを返します。もし、1ユーザーにつき1レコードだけ欲しい場合は、以下のクエリーを使用してください。

SQLFIDDLEExample

SELECT t1.*
FROM lms_attendance t1
WHERE t1.id = (SELECT t2.id
                 FROM lms_attendance t2
                 WHERE t2.user = t1.user            
                 ORDER BY t2.id DESC
                 LIMIT 1)