我在以下一对多关系中有以下表格:
company_company,company_portfolio,building_site和statistics_meter。我遇到的难度是决赛桌,statistics_meter。
为了本练习的利益,它的结构如下:
记录在同一张表中相关,其中一些是父米,有些是子米。如果一个记录是一个子记录,那么它将设置parent_meter_id,而关键的是,这个表是LEFT JOIN的设置为NULL的方式。
id | parent_meter_id | site_ref | building_id
1 | NULL | some building | 45
2 | NULL | some other building | 45
3 | 1 | and another | NULL
4 | 1 | one another one | NULL
5 | 2 | final one | NULL
我有两个要求:
1 - 计算设置building_id的父级数量(我正在成功完成)
2 - 计算parent_meter_id与(1)中计数的meter_id匹配的米数
因此,我期望得到(1)= 2和(2)= 3的结果。
这是我到目前为止的SQL ...我试图摆弄一个SUM案例,但我认为这是完全错误的。这在一个查询中是否可能?
感谢您的帮助。
SELECT
building_site.id as site_id,
building_site.site_ref as building_name,
COUNT(statistics_meter.id) AS meter_count,
SUM(CASE WHEN statistics_meter.parent_meter_id = [???] THEN 1 ELSE 0 END) AS check_meter_count
FROM company_company
LEFT JOIN company_portfolio ON company_portfolio.company_id=company_company.id
LEFT JOIN building_site ON building_site.portfolio_id=company_portfolio.id
LEFT JOIN statistics_meter ON statistics_meter.building_id=building_site.id
WHERE company_company.id=41
GROUP BY building_site.id
答案 0 :(得分:1)
如果我了解您,您需要使用子查询来获取具有建筑物ID的父计量表,然后将其加入主表。 SQL Fiddle
select
sm.id,
sm.parent_meter_id,
sm2.id as ID2,
sm.site_ref,
sm.building_id
from
statistics_meter sm
inner join (
select
id,
parent_meter_id
from
statistics_meter
where
building_id is not null) sm2
on sm.parent_meter_id = sm2.id
答案 1 :(得分:0)
不确定这是否是最有效的方法,但最后我执行了左连接和子查询,如下所示,并执行了两个计数,一个COUNT()总数来回答我的要求(2)和COUNT(不同)回答我的要求(1)
SELECT
count(distinct statistics_meter.id) as meter_count,
count(statistics_meter.id) as check_meter_count
FROM company_company
LEFT JOIN company_portfolio ON company_portfolio.company_id=company_company.id
LEFT JOIN building_site ON building_site.portfolio_id=company_portfolio.id
LEFT JOIN statistics_meter ON statistics_meter.building_id=building_site.id
LEFT JOIN (select * from statistics_meter where parent_meter_id is not NULL) sm2 on sm2.parent_meter_id = statistics_meter.id