2014-04-01 5 views
0

내가이 MYSQL 테이블을 가지고 ... 내가 달성하기 위해 노력하고있어사용자에 대해 마지막으로 삽입 된 값을 얻으려면 어떻게합니까?

+----+---------+-----------+---------------+------------+---------------------+ 
| id | user | val1  | val2   | val3  | last_modified_date | 
+----+---------+-----------+---------------+------------+---------------------+ 
| 1 | 0001 |   1 |    1 |   1 | 2014-03-31 16:53:29 | 
| 2 | 0100 |   1 |    1 |   1 | 2014-04-01 10:32:50 | 
| 3 | 0200 |   1 |    0 |   0 | 2014-04-01 10:34:13 | 
| 4 | 0200 |   1 |    1 |   1 | 2014-04-01 14:43:47 | 
+----+---------+-----------+---------------+------------+---------------------+ 

는 사용자를 위해 만든 모든 값 마지막 (시간 순서대로) 세트를 받고있다.

주어진 예제에서 사용자 0200에 대해 0을 삽입하지만 4 시간 후에 1을 삽입합니다. 마지막 값인 insert (1)을 가져오고 싶습니다.

select * 
from table 
where val3 = 1 
group by user 
order by last_modified_date desc; 

그리고 하나

select * from table group by user order by last_modified_date desc; 

이러한 쿼리는 예를 들어 테이블에 대해 잘 동작하는 것보다 일반적인 :

나는이 쿼리가 있습니다. 그들은 모든 경우에 대해 올바른가? "val3 = 1 인 모든 사용자를 마지막으로 삽입 된 값으로 선택"이라고 어떻게 말할 수 있습니까?

답변

1

당신은이 두 가지 방법 중 하나를 사용할 수 있습니다 시도해보십시오

옵션 1-t.val3에 대한 각 사용자 및 필터의 마지막 레코드 수 :

SELECT t.* 
FROM table t 
JOIN (
    SELECT MAX(last_modified_date) as last_modified, user 
    FROM table 
    GROUP BY user 
) as tt ON t.user = tt.user AND t.last_modified_date = tt.last_modified_date 
GROUP BY user 
HAVING val3 = 1 

옵션 2 - t.val3 = 1에 대한 모든 레코드를 가져오고 마지막 레코드가 아닌 레코드를 제거하십시오.

SELECT t.* 
FROM table t 
LEFT JOIN table tt ON tt.user = t.user AND tt.last_modified_date > t.last_modified_date 
WHERE t.val3 = 1 
AND tt.id IS NULL 
+0

첫 번째 변형본을 만들었습니다! 감사! – Napolux

1

select * from table as t1 
where val3 = 1 
and last_modified_date = 
(select max(last_modified_date) as last_modified_date from table as t2 
where t1.user=t2.user and t2.val3 = 1); 
+0

2 명의 사용자가 동일한 'last_modified_date'를 가지고 있지만 그 중 하나에 대한 마지막 레코드가 아닌 경우 어떻게됩니까? – Vatev

+0

val3 = 1 조건도 사용했습니다 – Madhivanan

+0

실수로't1.user = t2.user'를 놓쳤습니다. – Vatev

관련 문제