![](/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.