2012-01-04 18 views
3

我需要一個表來比較兩列,並給予3件事情比較2列:在同一個表

  • 行計數檢查(已檢查共行)的匹配行
  • 計數(行,其中兩列匹配)
  • 計數行的不同(行,其中兩列差異)

我已經能夠使用連接自己來匹配行,但我不確定如何一次獲得其他所有行。同時獲取所有信息的重要性是因爲這是一個非常活躍的表格,並且數據以很高的頻率變化。

我無法發佈表架構,因爲其中有大量與此問題無關的數據。有問題的列都是int(11) unsigned NOT NULL DEFAULT '0'。爲此,我會給他們打電話maskmask_alt

+0

你能否提供一些關於「匹配」,「不同」和「檢查」的含義的更多信息? – Bohemian 2012-01-04 00:24:44

+0

可以請你發表你的表格架構嗎? – 2012-01-04 00:30:03

+0

@johntotetwoo我不能,但我確實添加了更多關於它的細節。 – Jericon 2012-01-04 01:14:01

回答

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;的SQL等效代碼,而不是簡單的return condition;

+0

現在試試這個。我只限於過去的一天。不幸的是,我必須限制的一些列沒有編入索引,因此這導致大約300 M行的全表掃描:S – Jericon 2012-01-04 01:20:37

+0

是否有一種方法可以最初使用索引列來限制行,然後*運行上述。例如,如果您確信限制出現在數據的最後一週內,請首先選擇上週的數據作爲內部別名查詢,然後查詢結果。 – Bohemian 2012-01-04 01:42:18

+0

我拿回來了,我限制的幾列被索引,但是他們沒有很高的基數。在這張表中的8億行中,幾乎有400M必須被掃描。其中,有143場M比賽。這只是過去10周的結果。 – Jericon 2012-01-04 05:56:34

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