2017-12-04 5 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 | 
+-------------------------------------------------+ 

그리고 두 개의 쿼리가 필요합니다. 첫째, 모든 직원에게 그의 마지막 행동을 얻기 위해서. 그래서이 예제 테이블에서 모든 컬럼을 가지고 3,4,5 행을 얻어야 할 것입니다. 둘째, 지정된 직원에 대해서만 최신 조치를 취하십시오.

아이디어를 얻으려면 어떻게해야합니까? Spring Data JPA를 사용하고 있지만 원시 SQL 쿼리도 훌륭합니다.

미리 감사드립니다.

+0

선택 * 테이블 곳에서 [일시 (최대 (DATE_TIME 선택) 테이블에서 어디 employee_id = 1); 이것은 당신에게 특정 직원에 대한 최신 조치를 제공하고 당신은 쿼리에서 직원 ID를 변경하는 foreach 직원이 될 수 있습니다 –

답변

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) 

번째 하나에 대한 프레드 에드

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; 
관련 문제