我有两张桌子:
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中使用'fax'类型记录的记录数。
所以这个案例的答案是 1 (3 | Joe)
目前我有:
SELECT count(*)
FROM `T1`
JOIN `T2` on `T1`.`id` = `T2`.`T1_id`
WHERE `T2`.`type` != 'fax'
但这显然是在计算所有不是'传真'的记录。我只是无法理解我的想法。
任何帮助将不胜感激!
答案 0 :(得分: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;
答案 1 :(得分: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
答案 2 :(得分:1)
Strawberry和juergen d给出的答案是正确的,但为了完整起见,这是使用NOT EXISTS
的另一个例子。所有查询都有不同的执行计划,因此取决于T1
和T2
YMMV中的数据:
SELECT COUNT(*)
FROM `T1`
WHERE NOT EXISTS (
SELECT *
FROM `T2`
WHERE `T2`.`T1_id` = `T1`.`id`
AND `T2`.`type` = 'fax'
)