【问题标题】:MySQL AVG and GroupingMySQL AVG 和分组
【发布时间】:2012-12-19 23:11:14
【问题描述】:

我正在为 MySQL 声明而苦苦挣扎,并希望在我接近时得到一些指导,但并不完全在那里。我有一个数据库,其中包含一个物业地址表和物业出租清单。属性地址与一个或多个表相关,该表与一个地区表相关,然后与一个郊区表相关。

我正在尝试创建一个结果,该结果为我提供每个郊区每月的平均租金和卧室数量。

例如:

District Suburb Month YEAR YMD Bedrooms DataAverage 尼尔森小溪 01 2012 2012-01-01 00:00 1 190 尼尔森小溪 01 2012 2012-01-01 00:00 2 274 尼尔森小溪 01 2012 2012-01-01 00:00 3 341

然后我可以将其转换为如下表格:

平均租金
郊区床位 Jan-12 Feb-12 Mar-12 Apr-12 May-12 Jun-12 Jul-12 小溪 1 $150 $245 $160 $285 $135 $370 $350 2 $330 $340 $380 $310 $335 $345 $355 3 $350 $380 $310 $395 $380 $350 $350 内城 1 $160 $245 $260 $285 $295 $300 $350 2 $360 $440 $480 $410 $535 $545 $555 3 $370 $480 $510 $595 $480 $450 $550

我当前的 SQL 查询是这样的:

SELECT d.name as District, s.name AS Suburb,
FROM_UNIXTIME(l.StartDate,'%m') AS Month,
FROM_UNIXTIME(l.StartDate,'%Y') AS YEAR,
FROM_UNIXTIME(l.StartDate, '%Y-%m-01 00:00') AS YMD,
p.Bedrooms,
REPLACE(FORMAT(AVG(l.RentPerWeek),0),',','') AS DataAverage
FROM properties p
LEFT JOIN listings l on l.property_id=p.id
LEFT JOIN regions r on p.region_id=r.id
LEFT JOIN districts d on d.region_id=r.id
LEFT JOIN suburbs s on s.district_id=d.id
WHERE FROM_UNIXTIME(l.StartDate) BETWEEN DATE(NOW()) - INTERVAL (DAY(NOW()) - 1) DAY - INTERVAL 11 MONTH AND NOW()
GROUP BY District, Suburb, Year, Month, Bedrooms 
ORDER BY District, Suburb ASC, YMD ASC, Bedrooms ASC

不幸的是,每个郊区的结果都是一样的。我想我可能需要创建一个子查询 SQL 语句才能使其正常工作,但我并不完全确定。

所以我得到了这样的东西:

District Suburb Month YEAR YMD Bedrooms DataAverage 尼尔森小溪 01 2012 2012-01-01 00:00 1 190 尼尔森小溪 01 2012 2012-01-01 00:00 2 330 尼尔森小溪 01 2012 2012-01-01 00:00 3 350 尼尔森小溪 02 2012 2012-02-01 00:00 1 245 尼尔森小溪 02 2012 2012-02-01 00:00 2 340 尼尔森小溪 02 2012 2012-02-01 00:00 3 380 ... 尼尔森内城 01 2012 2012-01-01 00:00 1 190 尼尔森内城 01 2012 2012-01-01 00:00 2 330 尼尔森内城 01 2012 2012-01-01 00:00 3 350 尼尔森内城 02 2012 2012-02-01 00:00 1 245 尼尔森内城 02 2012 2012-02-01 00:00 2 340 尼尔森内城 02 2012 2012-02-01 00:00 3 380 。ETC。

平均租金
郊区床位 Jan-12 Feb-12 Mar-12 Apr-12 May-12 Jun-12 Jul-12 小溪 1 $150 $245 $160 $285 $135 $370 $350 2 $330 $340 $380 $310 $335 $345 $355 3 $350 $380 $310 $395 $380 $350 $350 内城 1 $150 $245 $160 $285 $135 $370 $350 2 $330 $340 $380 $310 $335 $345 $355 3 $350 $380 $310 $395 $380 $350 $350

任何指点或帮助将不胜感激。

【问题讨论】:

    标签: mysql group-by average


    【解决方案1】:

    假设id是每个表的主键,那么根据你的查询文本,一个property与一个region相关联,凭借@ properties 表上的 987654322@ 列:

          FROM properties p
          LEFT
          JOIN regions r 
            ON p.region_id=r.id
    

    一个district与一个region相关联(大概一个district是一个region的细分)

          LEFT
          JOIN districts d
            ON d.region_id=r.id
    

    并且一个suburb与一个district相关联(推测一个suburb是一个地区的一个细分。)

          LEFT
          JOIN suburbs s
            ON s.district_id=d.id
    

    最终结果是 region 内的每个属性都与该 region 内的每个 district 相关联,并与每个 相关联>郊区在每个内。

    因此,您得到的是一个区域内所有房产的平均租金值。

    要获得每个郊区的租金价值,您确实需要物业与其郊区之间的关系。

    您真正需要的是properties 表上的suburb_id 列作为suburbs 表的外键。

          LEFT
          JOIN suburbs s 
            ON s.district_id=d.id
           AND s.id = p.suburb_id
    

    【讨论】:

    • 啊....鸡蛋在脸上...我已经有一个郊区 ID 列。我想知道为什么我没有使用它????感谢您帮助我在树林中找到阿甘...
    猜你喜欢
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多