按mysql中的行数过滤结果

时间:2009-11-17 18:46:24

标签: mysql

我有三张桌子:

房屋

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)

如何找到有两辆车的房屋的平均平方英尺和平均千瓦时?

2 个答案:

答案 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

由于外键关系,您可以在ENERGIESHOUSES表之间使用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应该确保每辆汽车只计算一次。