今天我与MySQL战斗:我有两张表,其中包含类似的记录(实际上有更多列,但我认为它并不相关):
表计量:
id, value
1000, 0.117
1000, 0.689
1001, 0.050
...
表格Res(此表中每个ID不超过一条记录):
id, number_residents
1001, 2
...
我尝试按以下格式获得结果:
number_residents, avg, count(id)
2, 0.1234, 456
3, 0.5678, 567
...
用语言:我试图找出具有相同number_residents的值 -field的平均值。 id -field是两个表之间的连接。 count(id) - 列应显示已找到该number_residents的ID数。我能提出的问题如下:
select number_residents,count(distinct Metering.id),avg(value)
from Metering, Res
where Metering.id = Res.id
group by number_residents;
结果看起来像我搜索的内容,但当我尝试验证它们时,我变得不安全。我一开始尝试没有 distinct ,但这会导致结果的count-column中的值太高。 我的陈述是否正确得到我想要的东西?我认为它可能需要像执行here这样的执行顺序,但实际上我找不到任何正式的文档...
感谢您的帮助!
答案 0 :(得分:0)
根据表名判断,Res
是“父”表,Metering
是“子”表 - 即每个住所有0-n计量。
您使用“旧学校”加入(我的意思是旧 - 加入语法已存在25年了),这是内部加入,意味着住宅没有计量表将不参与结果。
使用外部加入:
select
number_residents,
count(distinct r.id) residences_count,
avg(value) average_value
from Res r
left join Metering m on m.id = r.id
group by number_residents
虽然meterings.id = res.id,但 left 连接计数它们可能会产生不同的结果:我已将计数更改为计算住所,这对于 left 加入意味着没有计量的住宅仍然有效。
现在,nulls(你从没有匹配行的左连接表中得到的)不参与avg()
- 如果你想要没有住所的话,你可以参加分子或分母计算平均值时要计算的任何计量(就好像为了划分总值而有一个零计量),请使用此查询:
select
number_residents,
count(distinct r.id) residences_count,
sum(value) / count(r.id) average_value
from Res r
left join Metering m on m.id = r.id
group by number_residents
因为res.id永远不为空,count(r.id)
计算每个住宅没有任何计量表的计量数加1。