2009-09-26 45 views
2

我有一個包含20列以上的表(客戶端),主要是歷史數據。比較表中各行之間字段差異

喜歡的東西: ID | clientID的|字段1 |科研成果|等.. | 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 

我希望能夠isplay每一行clientID的12和亮點B,從行11和C從行19

回答

0

在SQL任何表達&ž必須只在一行中引用列(禁止子查詢)。

A JOIN可用於在結果集的一行中創建兩個不同的行。

因此,您可以通過自聯接來比較不同行上的值。下面是顯示在加入每一行與同一客戶相關聯的所有其他行的一個例子(不包括參加行本身):

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

現在你可以寫一個比較列的表達式。例如,限制上述查詢到那些字段1的區別:

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

不指定你需要什麼類型的比較作出的,所以我把它留給你。關鍵是通常,您可以使用自連接來比較給定表中的行。


回覆您的意見和澄清:好吧,那麼你的「差異化」是不是簡單地通過值,而是由行的順序位置。請記住,關係數據庫沒有行號的概念,它們只有行的順序,您必須在ORDER BY子句中指定某些順序。不要將「id」僞碼與行號混淆,數字被指定爲單調遞增,只是它們的實現巧合。

在MySQL中,您可以利用user-defined variables來實現您正在尋找的效果。按clientId然後按id排序查詢,並跟蹤MySQL用戶變量中每列的值。噹噹前行中的值與變量中的值不同時,請儘量突出顯示您要做的事情。我將展示一個例子一個字段:

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; 

注意這個解決方案是不只是選擇的所有行與普通的SQL,併爲你取行與應用程序變量跟蹤值確實不同。

+0

謝謝比爾......我已經加入了這個問題來幫助解釋更好一點。我需要能夠同時查看給定客戶端的所有行並比較行中的所有字段... – Jason 2009-09-26 14:29:49

+0

感謝您的額外解釋。我想我必須回去嘗試一下你的選擇,並且在php中逐行跟蹤。 – Jason 2009-09-27 14:46:08