仅显示mysql中两行之间的差异

仅显示mysql中两行之间的差异,mysql,Mysql,如果(MySQL)审计表包含相似的行,是否可以只查看具有不同值的列 例如,一个包含四列的表,其中列key是主键,列id是匹配行的标识符: key id col1 col2 1 123 B C 2 123 A C 3 456 B C 4 789 B A 5 789 B B 6 987 A C 密钥id col1 col2 公元前1123年 212

如果(MySQL)审计表包含相似的行,是否可以只查看具有不同值的列

例如,一个包含四列的表,其中列
key
是主键,列
id
是匹配行的标识符:

key id col1 col2 1 123 B C 2 123 A C 3 456 B C 4 789 B A 5 789 B B 6 987 A C 密钥id col1 col2 公元前1123年 2123 A C 公元前3456年 4789 B A 5789B 6987 A C 在上面的示例中,我需要查询只返回第1、2、4和5行,因为它们具有匹配的id,并且col1和col2中的值不同,即B、A和B、A

key id col1 col2 1 123 B 2 123 A 4 789 A 5 789 B 密钥id col1 col2 1123b 2123A 4789 A 5789 B
我知道这可能不是一个非常有效的解决方案,但它提供了您想要的。试试这个:

SELECT A.ID, (CASE A.col1 WHEN B.col1 THEN NULL ELSE B.col1 END), (CASE A.col2 WHEN B.col2 THEN NULL ELSE B.col2 END) FROM tblName A
FULL OUTER JOIN tblName B
ON
A.ID=B.ID
WHERE
(A.col1=B.col1 AND A.Col2<>B.Col2)
OR
(A.col2<>B.col2 AND A.Col1=B.Col1)
从tblName A中选择A.ID,(当B.col1为案例A.col1时,则为NULL,否则B.col1结束),(当B.col2为案例A.col2时,则为NULL,否则B.col2结束)
完全外部连接tblName B
在…上
A.ID=B.ID
哪里
(A.col1=B.col1和A.Col2B.Col2)
或
(A.col2B.col2和A.Col1=B.Col1)

内部联接应该给出相同的结果

这有点做作,因为添加更多的行将给出非常不同的结果-但无论如何

SELECT x.my_key
     , x.id
     , IF(y.col1=x.col1,'',x.col1) col1
     , IF(y.col2=x.col2,'',x.col2) col2 
  FROM my_table x 
  JOIN my_table y 
    ON y.id = x.id 
   AND y.my_key <> x.my_key 
 WHERE (y.col1 <> x.col1 OR y.col2 <> x.col2) 
 ORDER 
    BY my_key;
选择x.my_键
,x.id
,如果(y.col1=x.col1',,x.col1)col1
,如果(y.col2=x.col2',,x.col2)col2
从我的表x
加入我的桌子
在y.id=x.id上
还有y,我的钥匙x,我的钥匙
其中(y.col1 x.col1或y.col2 x.col2)
命令
用我的钥匙;

感谢所有指导我的回复。 根据您的建议,我创建了如下sql:

SELECT
    T1.KEY,
    T1.ID,
    CASE T2.COL1_DISTINCT_VALUES WHEN 1 THEN NULL ELSE T1.COL1 END AS COL1,
    CASE T2.COL2_DISTINCT_VALUES WHEN 1 THEN NULL ELSE T1.COL2 END AS COL2
FROM
    TAB1 T1
INNER JOIN
(
    SELECT
        ID,
        COUNT(DISTINCT COL1) AS COL1_DISTINCT_VALUES,
        COUNT(DISTINCT COL2) AS COL2_DISTINCT_VALUES
    FROM
        TAB1
    GROUP BY
        ID
) T2
ON T1.ID=T2.ID
WHERE
    T2.COL1_DISTINCT_VALUES > 1
OR  T2.COL2_DISTINCT_VALUES > 1
ORDER BY
   KEY,ID;