【问题标题】:Comparing rows in table for differences between fields比较表中的行以了解字段之间的差异
【发布时间】:2010-12-01 14:36:18
【问题描述】:

我有一个包含 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。

【问题讨论】:

    标签: php jquery mysql


    【解决方案1】:

    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;
    

    你没有具体说明你需要进行什么样的比较,所以我将把它留给你。关键是,一般来说,您可以使用自连接来比较给定表中的行。


    关于你的 cmets 和澄清:好的,所以你的“差异”不仅仅是值,而是行的序数位置。请记住,关系数据库没有行号的概念,它们仅具有相对于您必须在 ORDER BY 子句中指定的某些顺序的行顺序。不要将“id”伪键与行号混淆,数字被分配为单调递增的,只有在它们的实现巧合时才会增加。

    在 MySQL 中,您可以利用 user-defined variables 来实现您想要的效果。按clientIdid 对查询进行排序,并跟踪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 选择所有行并在获取行时使用应用程序变量跟踪值并没有真正的不同。

    【讨论】:

    • 谢谢比尔...我已经添加到问题中以帮助更好地解释。我需要能够同时查看给定客户端的所有行并比较行中的所有字段...
    • 感谢您的补充说明。我想我必须回去尝试你的选择,并在 php 中逐行进行跟踪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2016-02-04
    相关资源
    最近更新 更多