2011-05-18 78 views
2

我的SQL查詢工作正常,直到我嘗試添加一個「WHERE距離< 10」和「塊-的算AS距離」 4日和10日線分別。任何想法如何解決它?謝謝!問題與這個MySQL查詢:(使用WHERE與AS子句)

Unknown column 'distance' in 'where clause' 

SELECT SQL_CALC_FOUND_ROWS places.*, category.*, 
COUNT(places_reviews.place_id) AS num_reviews, 
(places_popularity.rating_1 + 2*places_popularity.rating_2 + 3*places_popularity.rating_3 + 4*places_popularity.rating_4 + 5*places_popularity.rating_5)/(places_popularity.rating_1 + places_popularity.rating_2 + places_popularity.rating_3 + places_popularity.rating_4 + places_popularity.rating_5) AS average_rating, 
6371 * acos(cos(radians(places.lat)) * cos(radians(1.29315)) * cos(radians(103.827164) - radians(places.lng)) + sin(radians(places.lat)) * sin(radians(1.29315))) AS distance 
FROM (places) 
JOIN category 
ON places.category_id = category.category_id 
LEFT JOIN places_reviews ON places_reviews.place_id = places.id 
LEFT JOIN places_popularity ON places_popularity.place_id = places.id 
WHERE `places`.`category_id` = 1 AND `distance` < 5 AND places.name LIKE '%%' GROUP 
BY places.id 
ORDER BY id desc 
LIMIT 5 

回答

3

你需要把你的配方WHERE子句中,而不是使用別名距離。在SQL查詢中,WHERE子句的SELECT語句之前,所以別名(在這種情況下distance)尚不存在評估。這裏是你的SQL語句將是什麼樣子:

SELECT SQL_CALC_FOUND_ROWS places.*, category.*, 
COUNT(places_reviews.place_id) AS num_reviews, 
(places_popularity.rating_1 + 2*places_popularity.rating_2 + 3*places_popularity.rating_3 + 4*places_popularity.rating_4 + 5*places_popularity.rating_5)/(places_popularity.rating_1 + places_popularity.rating_2 + places_popularity.rating_3 + places_popularity.rating_4 + places_popularity.rating_5) AS average_rating, 
6371 * acos(cos(radians(places.lat)) * cos(radians(1.29315)) * cos(radians(103.827164) - radians(places.lng)) + sin(radians(places.lat)) * sin(radians(1.29315))) AS distance 
FROM (places) 
JOIN category 
ON places.category_id = category.category_id 
LEFT JOIN places_reviews ON places_reviews.place_id = places.id 
LEFT JOIN places_popularity ON places_popularity.place_id = places.id 
WHERE `places`.`category_id` = 1 
    AND (6371 * acos(cos(radians(places.lat)) * cos(radians(1.29315)) * cos(radians(103.827164) - radians(places.lng)) + sin(radians(places.lat)) * sin(radians(1.29315)))) < 5 
    AND places.name LIKE '%%' GROUP 
BY places.id 
ORDER BY id desc 
LIMIT 5 

你可以參考distance的名字將包裝你的聲明,使之成爲一個表中一個新的SELECT語句的唯一方法。例如:

SELECT * 
FROM (<insert your original query here without the WHERE distance= statement) AS t 
WHERE distance < 5 
+0

公式是很長的,有沒有什麼辦法來縮短它像使用AS子句? – Nyxynyx 2011-05-18 23:48:48

+0

@Nyxynyx - 我剛剛更新了我的文章,以反映如何做到這一點。但請注意,您將需要評估查詢執行計劃以找出每種方法的性能優勢/缺點。 – IAmTimCorey 2011-05-18 23:53:31

+0

你是否知道在WHERE子句中包含公式會導致公式計算任何東西?只是想知道 – Nyxynyx 2011-05-18 23:53:58