2011-12-10 6 views
6

MySQL 데이터의 몇 행을 비교하는 쉬운 방법이 있는지 궁금합니다.mysql의 행에 대한 차이점

특히, 내가 가진 것은 각 사용자에 대한 설정 값 목록이 들어있는 테이블입니다.

사용자는 GUI에서 이러한 설정을 문제없이 수정할 수 있습니다.

이제 내가하려는 것은 사용자가 새 데이터를 저장할 때마다 이전 데이터와 저장된 데이터 사이의 차이를 찾고 변경된 열과 나중에 저장하는 열을 찾고 싶습니다. 로그 ...

내가 지금하고있는 방식은 저장하고 비교하기 전에 변수를 변수로 변수를 변경된 데이터를 찾기 위해 사용자에게 해당하는 행을 읽는 것이지만 느린 발견하고 내가 거기 있는지 궁금합니다 아마도 mysql 쿼리 (어쩌면 임시 테이블을 사용하여) 내부에서 이것을 수행하는 더 똑똑한 방법입니까? 아니면 알 수없는 PHP MySQL 데이터베이스 함수를 사용하여 ...

저에 대한 아이디어가 있으면 좋겠네요.

는 (이 질문 확인 : https://stackoverflow.com/questions/218499/mysql-diff-tool을하지만 내가 무엇을 찾고보다 훨씬 다른 것으로 판명) 사전에

감사합니다!

+0

변경 사항을 기록하기를 원하면 [triggers] (http://dev.mysql.com/doc/refman/5.1/en/triggers.html)를 사용하십시오. 그런 다음 행이 업데이트 될 때마다 수동으로 확인하는 것에 대해 걱정할 필요가 없습니다. –

+0

@MichaelMior은 당신의 코멘트를 건너 뛴 것을 깨달았습니다. (그 덕분에, 그것도 매우 도움이되었습니다. –

+0

문제 없음 :) 행운을 빈다! –

답변

4

PHP에서는 array_diff_assoc() 함수를 사용하여이 작업을 수행 할 수 있습니다.

여기에는 PHP 배열의 두 행 데이터가 있습니다.

$newValues = array_diff_assoc($afterRow, $beforeRow); 

모든 열 값이 변경되거나 추가 된 배열을 반환합니다.

Prefs 
---------------------------------------------- 
UserID TransactionID Name  Value 
---------------------------------------------- 
1  1    Font  Sans Serif 
1  1    Color  Red 
1  1    Height  100 
1  1    Width  400 

1  2    Font  Verdana 
1  2    Color  Red 
1  2    Height  100 
1  2    Indent  50 

transactionId는 1이 2가있다 이전 행과 트랜잭션 ID입니다 :

편집

MySQL의에서이 작업을 수행하려면, 당신은 이름 값 쌍으로 이런 일을 필요할 것 새 행 :

SELECT * FROM Prefs new 
    LEFT JOIN Prefs old 
    ON new.Name = old.Name 
    AND new.Value = old.Value 
    WHERE UserID = 1 
    AND new.TransactionID = 2 
    AND old.TransactionID = 1 
    AND (old.Name IS NULL OR old.Value IS NULL) 

내 논리가 옳다면

이 양보해야

---------------------------------------------- 
UserID TransactionID Name  Value 
---------------------------------------------- 
1  2    Font  Verdana 
1  2    Indent  50 
+0

+0 매우 비슷한 해결책이 포함 된 답변을 삭제했습니다. 새로운 _elements_ 만 설명합니다. _changed values_는 고려하지 않습니다. –

+0

@ mmmshuddup 위의 해법이 변화된 가치를 설명하지 않는다고 말한다면, 나는 내 눈이 나를 속인다 고 말합니다. 그것을 시도하고 알려주세요. –

+0

음 ... 아니요. 제가 그 의견을 적었을 때 맹세했습니다. 대답 내용이 다릅니다! 롤. 나는 그것을 다시 읽고 내가 얻은 것을 말해 줄 것이다. 중간 시간 동안, 나는 이전의 코멘트를 철회한다. :) –