2011-05-18 77 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