【发布时间】:2015-07-02 16:05:00
【问题描述】:
所以我有一个我正在尝试运行的查询。现在它正在我的代码中运行一个循环,并对每个社区 ID 进行选择。我宁愿它只做一次选择,然后循环遍历这些结果,因为这对 DB imho 的影响要小得多。无论如何,我不明白为什么这两个查询给了我不同的结果:
第一个查询:
SELECT `neighbourhood_id`,
SUM(IF(`c`.`listing_offer` = 1, 1, 0)) as `listing_for_sale`,
AVG(IF(`c`.`listing_offer` = 1, `price`, 0)) as `avg_sale_price`,
SUM(IF(`c`.`listing_offer` = 2, 1, 0)) as `listing_for_rent`,
AVG(IF(`c`.`listing_offer` = 2, `price`, 0)) as `avg_rent_price`
FROM (
SELECT `n`.`id` AS `neighbourhood_id`, `l`.*
FROM `listing` `l`
LEFT JOIN `address` `a` ON `l`.`address_id` = `a`.`id`
LEFT JOIN `address_neighbourhood` `an` ON `a`.`id` = `an`.`address_id`
LEFT JOIN `neighbourhood` `n` ON `an`.`neighbourhood_id` = `n`.`id`
WHERE (`l`.`deleted`=0)
AND `n`.`id` IS NOT NULL
AND `n`.`id` = 1
GROUP BY `l`.`id`
) `c`
GROUP BY `neighbourhood_id`
结果:
neighbourhood_id listing_for_sale avg_sale_price listing_for_rent avg_rent_price
1 7541 486634.853967 4045 786.372706
第二次查询:
SELECT `neighbourhood_id`,
SUM(IF(`c`.`listing_offer` = 1, 1, 0)) as `listing_for_sale`,
AVG(IF(`c`.`listing_offer` = 1, `price`, 0)) as `avg_sale_price`,
SUM(IF(`c`.`listing_offer` = 2, 1, 0)) as `listing_for_rent`,
AVG(IF(`c`.`listing_offer` = 2, `price`, 0)) as `avg_rent_price`
FROM (
SELECT `n`.`id` AS `neighbourhood_id`, `l`.*
FROM `listing` `l`
LEFT JOIN `address` `a` ON `l`.`address_id` = `a`.`id`
LEFT JOIN `address_neighbourhood` `an` ON `a`.`id` = `an`.`address_id`
LEFT JOIN `neighbourhood` `n` ON `an`.`neighbourhood_id` = `n`.`id`
WHERE (`l`.`deleted`=0)
AND `n`.`id` IS NOT NULL
GROUP BY `l`.`id`
) `c`
WHERE `neighbourhood_id` = 1
GROUP BY `neighbourhood_id`
结果:
neighbourhood_id listing_for_sale avg_sale_price listing_for_rent avg_rent_price
1 5740 522544.830430 2870 762.646690
我很确定查询 1 是正确的结果,所以我不确定为什么我在第二个查询中得到不同的结果。尽管就哪一个是正确的而言,我仍然需要得到纠正。
非常感谢任何帮助。
【问题讨论】:
-
第二种情况下的内部“GROUP BY”可能正在对具有 neighbourhood=1 和其他一些值的行进行分组,并在选择结果中返回其他值之一作为邻域。
-
在第一个查询中是 "AND
n.idIS NOT NULL" 因为子句的下一部分是 "ANDn。id= 1" 是互斥的 -
@PaulF
IS NOT NULL在那里,因为我想删除 `n.id=1` 并获取所有社区的结果。