在连接表中获取多个计数

时间:2010-09-25 01:10:32

标签: sql mysql aggregate-functions

我有3个相关的表格:

business
  id
  name

inspection
  id
  business_id
  date

violation
  id
  inspection_id
  title

我想出去:
[business.id,Count(Inspections),Count(Violations)]

其中Count(Inspections)是此商家所拥有的检查总数,而Count(违规)是该商家所有检查的违规总数。

我可以在一个查询中做一个或另一个,但我不确定如何一次性完成这两个。

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

1 个答案:

答案 0 :(得分: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 join语法。