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

时间:2014-11-27 13:56:56

标签: 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

在上面的例子中,我需要查询只返回第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

3 个答案:

答案 0 :(得分:0)

我知道它可能不是一个非常有效的解决方案,但可以提供你想要的东西。试试这个:

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)

INNER JOIN应该给出相同的结果

答案 1 :(得分:0)

这有点做作,因为添加更多行会产生非常不同的结果 - 但无论如何...

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;

答案 2 :(得分:0)

感谢所有指导我的回复。 使用你的建议我做了这样的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;