比较同一个表中的2列

时间:2012-01-04 00:13:38

标签: mysql

我需要比较表中的2列并给出3件事:

  • 已检查的行数(已检查的总行数)
  • 匹配的行数(2列匹配的行数)
  • 不同的行数(2列不同的行)

我已经能够使用连接本身获得匹配的行,但我不确定如何一次性获取所有其他内容。同时获取所有信息的重要性在于,这是一个非常活跃的表,数据的变化频率很高。

我无法发布表模式,因为其中有大量数据与此问题无关。相关列均为int(11) unsigned NOT NULL DEFAULT '0'。出于此目的,我将称他们为maskmask_alt

2 个答案:

答案 0 :(得分:4)

select
    count(*) as rows_checked,
    sum(col = col2) as rows_matching,
    sum(col != col2) as rows_different
from table

请注意优雅使用sum(condition) 这是有效的,因为在mysql true1false0。对这些进行求和会计算条件为true的次数。它比case when condition then 1 else 0 end更优雅,if (condition) return true else return false;与编码return condition;的SQL等价,而不仅仅是{{1}}。

答案 1 :(得分:2)

假设您想要计算col1等于或不等于col2的行,您可以使用与SUM()结合的汇总CASE

SELECT
  COUNT(*) AS total,
  SUM(CASE WHEN col = col2 THEN 1 ELSE 0 END )AS matching,
  SUM(CASE WHEN col <> col2 THEN 1 ELSE 0 END) AS non_matching
FROM table

但是,在子查询中获取总COUNT(*)可能更有效,并且如果上述内容不够高,则使用该值减去匹配以获得不匹配。

SELECT
  total,
  matching,
  total - matching AS non_matching
FROM
(
  SELECT
    COUNT(*) AS total,
    SUM(CASE WHEN col = col2 THEN 1 ELSE 0 END )AS matching
  FROM table
) sumtbl