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

时间:2009-09-26 03:23:10

标签: php jquery mysql

我有一个包含20多列的表(客户端),主要是历史数据。

像: ID | clientID的| FIELD1 | FIELD2 |等... | 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行和C&的B行。第19行Z.

1 个答案:

答案 0 :(得分:0)

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中,您可以利用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选择所有行并在获取行时使用应用程序变量跟踪值并没有什么不同。