2012-09-24 3 views
1

데이터가 변경된 경우에만 테이블에 데이터를 추가하는 효율적인 방법을 찾으려면 도움이 필요합니다. 날짜로 마지막 레코드 이후에 데이터가 변경된 경우에만 테이블에 레코드 추가

나는 LatestResults 만 저장 (각 팀 번호 1) 최신 결과

TeamNumber(Primary) TeamScore TeamWorkUnits RecordDateTime 
1 - 500 - 600 - 2012-09-22 08:20:00 
2 - 400 - 6 - 2012-09-22 08:20:00 
3 - 90 - 15 - 2012-09-22 08:20:00 
4 - 1 - 0 - 2012-09-22 08:20:00 

HistoricResults에게 저장 매우 결과의 사본을 호출되는 다른 테이블을 첫 번째 테이블이 나는 미래의 통계를 위해서 필요하다.

HisotryKey(Auto-Primary) TeamNumber TeamScore TeamWorkUnits RecordDateTime 
1 - 1 500 - 600 - 2012-09-22 08:20:00 
2 - 2 -400 - 6 - 2012-09-22 08:20:00 
3 - 3- 90 - 15 - 2012-09-22 08:20:00 
4 - 4 - 1 - 0 - 2012-09-22 08:20:00 
5 - 1 490 - 600 - 2012-09-21 08:20:00 
6 - 2 -300 - 6 - 2012-09-21 08:20:00 
7 - 3- 40 - 15 - 2012-09-21 08:20:00 
8 - 4 - 0 - 0 - 2012-09-21 08:20:00 

그래서 나는 데이터 TeamScore 또는 TeamWorkUnits이 RecordDateTime에 의해 마지막 레코드 이후 변경된 경우에만 두 번째로 첫 번째 테이블을 병합 할.

TeamScore 및 TeamWorkUnits가 동일한 경우 History 테이블에서 가장 오래된 항목을 유지합니다.

가능한 경우 속도를 위해 MySQL 내에서이 작업을 완전히 수행하는 것이 좋습니다.

현재 나는 당신의 도움을 사전에 시간당

덕분에 약 10 만 기록을 확인해야합니다.

+0

저는 MySQL 전문가는 아니지만, 왜 그것을 하나의 테이블에 가지고 있지 않습니까? 그게 더 간단하지 않을까요? – Svish

+0

http://www.whathaveyoutried.com/. 그래서 이런 식으로 작동하지 않습니다. 몇 가지 코드/오류/노력을 보여 주시면 해결하도록 도와 드리겠습니다. – mtk

+0

알았어, 미안하지만이 사이트는 지식/기술이없는 사람들을 돕는 사이트라고 생각했습니다. 나는 사람들이 나를 좋아하는 사람들을 돕고 싶지 않다면 다른 곳을 보게 될 것이다. –

답변

1

당신은이 방법을 시도 할 수 있습니다 :

다음
insert into HistoricResults 
    (teamNumber, TeamScore, TeamWorkUnits, RecordDateTime) 
    select 
    lr.teamNumber, 
    lr.TeamScore, 
    lr.TeamWorkUnits, 
    NOW() 
    from 
    LatestResults lr 
    where 
    exists (
     select 
     * 
     from 
     HistoricResults hs 
     where 
     hs.teamNumber = lr.teamNumber and 
     (hs.TeamScore != lr.TeamScore or hs.TeamWorkUnits != lr.TeamWorkUnits) 
     and hs.RecordDateTime = (select max(RecordDateTime) 
           from HistoricResults hs1 
           where hs1.teamNumber = lr.teamNumber) 
     order by RecordDateTime desc 
    ) 

가 작동하는 방법 : exist 내에서 하위 쿼리가 TeamScore 또는 LatestResults 테이블 레코드에서 다른 TeamWorkUnits와 가장 최근의 기록을 위해 HistoricResults에서 찾고 있습니다. 그러한 레코드가 발견되면 외부 select은 적절한 레코드를 LatestResults에서 선택하고 이러한 레코드는 마지막으로 HistoricResults에 삽입됩니다.

관련 문제