2017-07-31 54 views
2

我有2個表:計數記錄,其中有在鏈接表中匹配特定條件的任何記錄

T1:

id | name 
------ | ------ 
    1 | Bob 
    2 | John 
    3 | Joe 

T2:

id | T1_id | type 
------ | ------ | ------ 
    1 | 1 | call 
    2 | 1 | email 
    3 | 1 | fax 
    4 | 2 | call 
    5 | 2 | email 
    6 | 2 | fax 
    7 | 3 | call 
    8 | 3 | email 

我想算T1中的記錄數量不是在T2中有一種「傳真」類型的記錄。

因此,在這種情況下,答案是(3 |喬)

目前我有:

SELECT count(*) 
FROM `T1` 
JOIN `T2` on `T1`.`id` = `T2`.`T1_id` 
WHERE `T2`.`type` != 'fax' 

但是,這顯然是計算所有不屬於「傳真」的記錄。我不能理解我的邏輯。

任何幫助,將不勝感激!

回答

4

子查詢是不必要的:

SELECT COUNT(DISTINCT t1.id) 
    FROM t1 
    LEFT 
    JOIN t2 
    ON t2.t1_id = t1.id 
    AND t2.type = 'fax' 
WHERE t2.id IS NULL; 
+0

對於那些有興趣,這種技術(左加入,則空值檢查)被稱爲左反半連接 –

+0

謝謝,這對我很有幫助(就像其他人一樣,但是這對於我想要的是最有用的) – cfardella

+0

@e_i_pi謝謝,我以前沒有遇到過。沒有正式的主題培訓,我總是將此稱爲排除連接。 – Strawberry

2
select count(*) 
from 
(
    SELECT t1.id 
    FROM T1 
    LEFT JOIN T2 on T1.id = T2.T1_id 
    GROUP BY t1.id 
    HAVING sum(T2.type = 'fax') = 0 
) tmp 
1

的草莓和Juergen d給出的答案是正確的,但對於完整性,這是一個使用NOT EXISTS另一個例子。所有的疑問都會有不同的執行計劃,所以這取決於你的數據在T1T2因人而異:

SELECT COUNT(*) 
FROM `T1` 
WHERE NOT EXISTS (
    SELECT * 
    FROM `T2` 
    WHERE `T2`.`T1_id` = `T1`.`id` 
    AND `T2`.`type` = 'fax' 
) 
相關問題