2013-06-13 5 views
0

1 -MYSQL : 선택 변경된 행

create table changes(snapdate date,value int, uid int); 
insert into changes values 
('2013-04-22', 0, 1), 
('2013-04-21', 1,1), 
('2013-04-20', 1,1), 
('2013-04-19', 1,1), 
('2013-04-19', 0,2), 
('2013-04-19', 1,1), 
('2013-04-18', 0,1), 
('2013-04-17', 0,1), 
('2013-04-17', 1,2), 
('2013-04-16', 1,1), 
('2013-04-16', 0 ,2); 

2 -

SELECT a.snapdate, a.value 
FROM ( 
    SELECT t1.*, COUNT(*) AS rank 
    FROM changes t1 
    LEFT JOIN changes t2 ON t1.snapdate >= t2.snapdate 
    GROUP BY t1.snapdate 
) AS a 
LEFT JOIN ( 
    SELECT t1.*, COUNT(*) AS rank 
    FROM changes t1 
    LEFT JOIN changes t2 ON t1.snapdate >= t2.snapdate 
    GROUP BY t1.snapdate 
) AS b ON a.rank = b.rank+1 AND a.value = b.value 
WHERE b.snapdate IS NULL 
ORDER BY a.snapdate DESC; 

잘 작동하지만 어떻게 예를 들어 WHERE uid=2을 선택?

create temporary table changes_temp 
    as 
    select * 
    from changes 
    where uid = 2 

http://dev.mysql.com/doc/refman/5.0/en/temporary-table-problems.html

답변

0

시도가 하위 쿼리에 WHERE 절을 추가하기를

SELECT a.snapdate, a.value 
FROM ( 
    SELECT t1.*, COUNT(*) AS rank 
    FROM changes t1 
    LEFT JOIN changes t2 ON t1.snapdate >= t2.snapdate 
    WHERE t2.uid=t1.uid AND t2.uid=2 
    GROUP BY t1.snapdate 
) AS a 
LEFT JOIN ( 
    SELECT t1.*, COUNT(*) AS rank 
    FROM changes t1 
    LEFT JOIN changes t2 ON t1.snapdate >= t2.snapdate 
    WHERE t2.uid=t1.uid AND t2.uid=2 
    GROUP BY t1.snapdate 
) AS b ON a.rank = b.rank+1 AND a.value = b.value 
WHERE b.snapdate IS NULL 
ORDER BY a.snapdate DESC; 

테스트 용으로 SQLFiddle을 생성했습니다. 그게 당신이 원하는 것입니까? 검색어의 목표를 설명하지 않았습니다.

+0

그냥 한 단어 ==> PERFECT – OlZ

+0

http://stackoverflow.com/questions/17085069/mysql-select-changedrow – OlZ

0

는 where 절 추가 : 나는 임시 테이블을 사용할 수 없습니다

SELECT a.snapdate, a.value 
FROM ( 
    SELECT t1.*, COUNT(*) AS rank 
    FROM changes t1 
    LEFT JOIN changes t2 ON t1.snapdate >= t2.snapdate 
    WHERE t1.uid = 2 
    GROUP BY t1.snapdate 
) AS a 
LEFT JOIN ( 
    SELECT t1.*, COUNT(*) AS rank 
    FROM changes t1 
    LEFT JOIN changes t2 ON t1.snapdate >= t2.snapdate 
    WHERE t1.uid = 2 
    GROUP BY t1.snapdate 
) AS b ON a.rank = b.rank+1 AND a.value = b.value 
WHERE b.snapdate IS NULL 
ORDER BY a.snapdate DESC; 

sqlfiddle