我有三张桌子:
房屋
id | square_feet
------------------
1 | 2000
2 | 1600
3 | 1000
能量
id | house_id | kwh
-------------------------
6 | 1 | 10
7 | 2 | 100
8 | 3 | 200
汽车
id | energy_id | gallons
--------------------------
11 | 6 | 20
12 | 6 | 40
13 | 7 | 200
14 | 8 | 77
15 | 8 | 88
我需要得到所有房屋的平均平方英尺和平均千瓦时,或者只需要有一定数量汽车的房屋。
所以对于两辆车,我想要房子1和3的价值。对于一辆车,我只想要房子2的价值。对于所有的房子,我想要1,2和3。
对于我正在使用的所有房屋:
SELECT AVG(houses.square_feet) AS avg_sf, AVG(energies.kwh) AS avg_kwh
FROM (houses LEFT JOIN energies ON houses.id = energies.house_id)
如何找到有两辆车的房屋的平均平方英尺和平均千瓦时?
答案 0 :(得分:2)
使用:
SELECT AVG(h.square_feet),
AVG(e.kwh)
FROM ENERGIES e
JOIN HOUSES h ON h.id = e.house_id
JOIN (SELECT c.energy_id
FROM CARS s
GROUP BY e.energy_id
HAVING COUNT(*) = 2) x ON x.energy_id = e.id
由于外键关系,您可以在ENERGIES
和HOUSES
表之间使用JOIN而不是LEFT JOIN。
更新以添加您可以更改:
HAVING COUNT(*) = 2
...根据你想知道的汽车数量,你喜欢的任何数字。
答案 1 :(得分:1)
我使用WHERE ... IN
构造。 JOIN
有可能通过复制能源行来改变平均值。
SELECT
AVG(houses.square_feet) AS avg_sf,
AVG(energies.kwh) AS avg_kwh
FROM houses
LEFT JOIN energies ON houses.id = energies.house_id
WHERE houses.house_id in (
SELECT energies.house_id
FROM energies
JOIN cars ON cars.energy_id = energies.id
GROUP BY energies.house_id
HAVING count(distinct cars.id) = 2
)
GROUP BY houses.id
如果一个房子通过能量表有多个链接到一辆汽车,这甚至有用,COUNT DISTINCT
应该确保每辆汽车只计算一次。