2009-09-26 3 views
2

저는 주로 기록 데이터 인 20 개 이상의 열이있는 테이블 (클라이언트)을 보유하고 있습니다.필드의 차이점에 대한 테이블의 행 비교

뭔가 같은 : ID | 된 ClientID | 필드 1 | FIELD2 | 등등 ... | updateDate

내 데이터는 다음과 같습니다 경우

  
    10|12|A|A|...|2009-03-01 
    11|12|A|B|...|2009-04-01 
    19|12|C|B|...|2009-05-01 
    21|14|X|Y|...|2009-06-11 
    27|14|X|Z|...|2009-07-01 

각 행을 비교하는 쉬운 방법이 있나요 및 필드의 차이점을 강조 표시 하시겠습니까? 리비전간에 변경된 필드를 간단하게 강조 표시 할 수 있어야합니다 (키와 날짜 제외)

각 새 행에 하나 이상의 필드가 여러 개 업데이트 될 수 있습니다.

이것은 클라이언트 기반으로되어 있으므로 필터링 할 clientID를 선택할 수 있습니다.

서버 또는 클라이언트 쪽 일 수 있습니다. 어느 쪽이 가장 쉽습니다. 내 설명을 조금 확대해야

자세한 내용 : 나는 필드의 차이가 (하나가 어떤 식 으로든 다른)이 있다면 바로 볼 수 찾고 있어요. 데이터 중 일부는 숫자이며 일부는 텍스트입니다. 더 완벽한 예는 다음과 같을 수 있습니다

  
    10|12|A|A|F|G|H|I|J|...|2009-03-01 
    11|12|A|B|F|G|H|I|J|...|2009-04-01 
    19|12|C|B|F|G|Z|I|J|...|2009-05-01 *** 
    21|14|X|Y|L|M|N|O|P|...|2009-06-11 
    27|14|X|Z|L|M|N|O|P|...|2009-07-01 

내가 & Z 행 (19)

답변

0

SQL의 모든 표현에서 행 (11)와 C에서 clientid는 12 하이라이트 B에 대한 각 행을 isplay 할 수 있도록하려는 것 한 행에서만 열을 참조해야합니다 (하위 쿼리 제외).

JOIN은 두 개의 다른 행을 결과 집합의 한 행으로 만드는 데 사용할 수 있습니다.

셀프 조인을 통해 다른 행의 값을 비교할 수 있습니다. 여기에 같은 클라이언트와 연관된 다른 모든 행에 각 행에 합류 보여주는 예입니다 (A 자체에 행의 결합 제외) :

SELECT c1.*, c2.* 
FROM client c1 
JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id) 

지금 당신이 열을 비교 표현을 쓸 수 있습니다.

SELECT c1.*, c2.* 
FROM client c1 
JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id) 
WHERE c1.field1 <> c2.field1; 

당신은 당신이 할 필요가 무엇인지 비교의 종류를 지정하지 않는, 그래서 당신을 떠날 것이다 : 필드 1은 다른 곳 예를 들어, 사람들에게 위의 쿼리를 제한 할 수 있습니다. 요점은 일반적으로 자체 조인을 사용하여 주어진 테이블의 행을 비교할 수 있다는 것입니다. 좋아, 당신의 "차이"값이 아니라 행의 서수 위치에 따라 단순히입니다 : 여러분의 의견과 설명을 다시


. 관계형 데이터베이스에는 행 번호 개념이 없으므로 ORDER BY 절에 지정해야하는 일부 순서와 관련하여 행 순서 만 있습니다. "id"가짜를 행 번호와 혼동하지 마십시오. 숫자는 구현의 우연에 의해서만 단조롭게 증가합니다.

MySQL에서는 user-defined variables을 사용하여 원하는 효과를 얻을 수 있습니다.쿼리를 clientId으로 주문한 다음 id으로 주문하고 MySQL 사용자 변수에서 열 당 값을 추적하십시오. 현재 행의 값이 변수의 값과 다른 경우 수행 할 강조 표시를 수행하십시오. 나는 하나 개의 필드에 대한 예를 보여 드리겠습니다 :이 솔루션은 그냥 일반 SQL로 모든 행을 선택하고 행을 인출으로 응용 프로그램 변수에 값을 추적에서 정말 다르지 않다

SET @clientid = -1, @field1 = ''; 
SELECT id, clientId, field1, @clientid, @field1, 
    IF(@clientid <> clientid, 
    ((@clientid := clientid) AND (@field1 := field1)) = NULL, 
    IF (@field1 <> field1, 
     (@field1 := field1), 
     NULL 
    ) 
) AS field1_changed 
FROM client c 
ORDER BY clientId, id; 

참고.

+0

감사합니다. Bill ... 조금 더 설명하는 데 도움이되는 질문을 추가했습니다. 동시에 주어진 클라이언트에 대한 모든 행을보고 행의 모든 ​​필드를 비교할 수 있어야합니다 ... – Jason

+0

추가 설명을 주셔서 감사합니다. 나는 돌아가서 옵션을 시도 할뿐만 아니라 행별로 PHP에서 추적을 올바르게 수행해야한다고 생각합니다. – Jason