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

我有一个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 |百灵| ... | 2009-03-01
     11 | 12 | A | B | F | G | H | I |百灵| ... | 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选择所有行并在获取行时使用应用程序变量跟踪值并没有什么不同。