计算一个表中的记录,其中链接表中没有符合特定条件的记录

时间:2017-07-31 00:04:14

标签: mysql

我有两张桌子:

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'

但这显然是在计算所有不是'传真'的记录。我只是无法理解我的想法。

任何帮助将不胜感激!

3 个答案:

答案 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的另一个例子。所有查询都有不同的执行计划,因此取决于T1T2 YMMV中的数据:

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