2010-09-25 110 views
2

我有3个相关的表获取多个计数
[business.id,计数(检查),伯爵(违规)跨越连接表

其中计数(检查)是该企业进行的检查总次数,计数(违规)是该企业所有检查中违规总数。

我可以做一个或另一个在一个单一的查询,但我不知道如何一举两得。

SELECT b.id, COUNT(i.id) 
FROM inspections_business b, inspections_inspection i 
WHERE 
b.id = i.business_id 
GROUP BY b.id 

SELECT b.id, COUNT(v.id) 
FROM inspections_business b, inspections_inspection i, inspections_violation v 
WHERE 
b.id = i.business_id 
AND i.id = v.inspection_id 
GROUP BY b.id 

回答

2

使用OUTER联接:

SELECT b.id, 
      COUNT(i.id) AS num_inspections, 
      COUNT(v.id) AS num_violations 
    FROM BUSINESS b 
LEFT JOIN INSPECTION i ON i.business_id = b.id 
LEFT JOIN VIOLATION v ON v.inspection_id = i.id 
GROUP BY b.id 

您的查询使用ANSI-89连接语法,在连接标准是WHERE子句。它已被ANSI-92语法取代。没有性能优势,但当每个数据库供应商对于ANSI-89都有自己的OUTER连接语法时,OUTER连接语法得到始终支持。