![](/img/trans.png)
[英]How to get the biggest differences between two fields comparing all users?
[英]Comparing rows in table for differences between fields
我有一個包含20多個列的表(客戶端),大部分都是歷史數據。
像這樣的東西:id | clientID | field1 | field2 | etc ... | 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
我希望能夠播放clientID 12的每一行,並突出顯示第11行的B和第19行的C&Z。
SQL中的任何表達式都只能引用一行中的列(禁止子查詢)。
可以使用JOIN
將兩個不同的行變成結果集的一行。
因此,您可以通過自聯接比較不同行上的值。 這是一個示例,該示例顯示將每一行連接到與同一客戶端相關聯的每隔一行(不包括將一行連接到自身)。
SELECT c1.*, c2.*
FROM client c1
JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id)
現在,您可以編寫比較列的表達式。 例如,將上述查詢限制為field1不同的查詢:
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中,您可以利用用戶定義的變量來實現所需的效果。 按clientId
然后按id
clientId
查詢,並跟蹤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選擇所有行並在獲取行時使用應用程序變量跟蹤值並沒有什么不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.