2017-12-04 3 views
0

私はMySQL DBを持っており、従業員の活動ログを持つテーブルがあります。MySQLのすべての従業員と特定の従業員の最新のレコードのみを選択してください。

+-------------------------------------------------+ 
| log_id | employee_id | date_time | action_type | 
+-------------------------------------------------+ 
| 1 |  1  | 2015/02/03 | action1 | 
| 2 |  2  | 2015/02/01 | action1 | 
| 3 |  2  | 2017/01/02 | action2 | 
| 4 |  3  | 2016/02/12 | action1 | 
| 5 |  1  | 2016/10/12 | action2 | 
+-------------------------------------------------+ 

そして2つのクエリが必要です。まず、すべての従業員に最後の行動を取る。したがって、この例の表から、すべての列で行3,4を取得する必要があります。次に、指定された従業員の最新のアクションを取得します。

これを実現する方法はありますか?私はSpring Data JPAを使用していますが、生のSQL Queryも素晴らしいでしょう。

ありがとうございます。

+0

選択*テーブルからどこで[日時](マックス(DATE_TIMEを選択)テーブルからどこemployee_id = 1);これはあなたに特定の従業員のための最新のアクションを与えるだろうし、 –

答えて

1

あなたは自己を実行して、期待される出力を得ることができますが、それは同じDATE_TIMEを持つ行がある場合は、どの決定するCASE文と別の属性を必要とするかもしれない単一の従業員のために複数の行を返すことがあり注意

select a.* 
from demo a 
left join demo b on a.employee_id = b.employee_id 
and a.date_time < b.date_time 
where b.employee_id is null 

に参加します行は、あなたの最初のクエリのために状況

Demo

1

のこの種を扱うために選んされなければなりません。単に

SELECT t1.* 
FROM tableName t1 
WHERE t1.log_id = (SELECT MAX(t2.log_id) 
       FROM tableName t2 
       WHERE t2.employee_id = t1.employee_id) 

1秒間フレッド編ため

SELECT t1.* 
FROM tableName t1 
WHERE t1.employee_id=X and t1.log_id = (SELECT MAX(t2.log_id) 
       FROM tableName t2 
       WHERE t2.employee_id = t1.employee_id); 
0

準備ができて...

SELECT x.* 
    FROM my_table x 
    JOIN 
    (SELECT employee_id 
      , MAX(date_time) date_time 
     FROM my_table 
     GROUP 
      BY employee_id 
    ) y 
    ON y.employee_id = x.employee_id 
    AND y.date_time = x.date_time; 
関連する問題