1

我正在为 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

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

4

1 回答 1

0

假设这id是每个表的主键,那么根据您的查询文本,一个属性与一个region相关联,凭借表region_id上的列properties

      FROM properties p
      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

最终结果是,一个区域内的每个房产都与该区域内的每个区域相关联,并与每个区域内的每个郊区相关联。

因此,您将获得一个地区内所有房产的平均租金值。

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

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

      LEFT
      JOIN suburbs s 
        ON s.district_id=d.id
       AND s.id = p.suburb_id
于 2012-12-19T23:26:13.377 回答