繁体   English   中英

比较表中的行以了解字段之间的差异

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM