2010-09-25 90 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連接語法得到始終支持。