我有一个包含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.
答案 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选择所有行并在获取行时使用应用程序变量跟踪值并没有什么不同。