所以我有一個查詢,我試圖運行。現在它運行在代碼中的一個循環中,並對每個鄰居ID進行選擇。我寧願它做一個單一的選擇,只是循環通過這些結果,因爲這是少得可憐的數據庫imho。總之,我想不通爲什麼這兩個查詢給了我不同的結果:當我覺得它應該是相同的時獲得不同的SQL結果
首先查詢:
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」可以分組排它確實有街坊= 1&也有一些其他的值返回其他值中的一個作爲選擇結果中的鄰域。 – PaulF
在第一個查詢中是_「AND'n'.'id' IS NOT NULL」_是必要的,因爲子句的下一部分是_「AND'n'.'''' = 1」_這是互斥的 – PaulF
@PaulF 'IS NOT NULL'在那裏,因爲我想刪除'n.id = 1'並得到所有社區的結果。 – SynackSA