我需要比较表中的2列并给出3件事:
我已经能够使用连接本身获得匹配的行,但我不确定如何一次性获取所有其他内容。同时获取所有信息的重要性在于,这是一个非常活跃的表,数据的变化频率很高。
我无法发布表模式,因为其中有大量数据与此问题无关。相关列均为int(11) unsigned NOT NULL DEFAULT '0'
。出于此目的,我将称他们为mask
和mask_alt
。
答案 0 :(得分:4)
select
count(*) as rows_checked,
sum(col = col2) as rows_matching,
sum(col != col2) as rows_different
from table
请注意优雅使用sum(condition)
这是有效的,因为在mysql true
中1
而false
是0
。对这些进行求和会计算条件为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