我的SQL查询使用MAX,MIN和第三个字段进行HAVING

时间:2015-08-19 16:41:48

标签: mysql sql

我试图在mysql(MyISAM)查询中获得最低和最高价格。 我使用此查询:

SELECT MAX(price_feed) as max, 
       MIN(price_feed) as min, 
       SQRT( POW(69.1 * (latitude_feed - 51.542980), 2) + POW(69.1 * (-0.149323 - longitude_feed ) * COS(latitude_feed / 57.3), 2)) AS distance
  FROM feed
 WHERE listing_type_feed = 'rental' 
       and property_type_feed IN ("Flat", "Apartament", "Penthouse", "Studio")
HAVING distance < 2

但是当我尝试

时它什么也没有返回
SELECT price_feed as max, 
       price_feed as min, 
       SQRT( POW(69.1 * (latitude_feed - 51.542980), 2) + POW(69.1 * (-0.149323 - longitude_feed ) * COS(latitude_feed / 57.3), 2)) AS distance
  FROM feed 
 WHERE listing_type_feed = 'rental' 
       and property_type_feed IN ("Flat", "Apartament", "Penthouse", "Studio") 
HAVING distance < 2

返回2600行。 感谢

2 个答案:

答案 0 :(得分:0)

在纯SQL中,在使用聚合或分组的查询中选择不是聚合函数的字段或按字段分组是错误的。

在mysql中,您可以选择任何字段,但如果它不是按字段分组或聚合函数,则返回的值可以是结果集中的任何值。因此,除非您按键分组,否则它是未定义的。

在第一个查询中没有group by子句,因此聚合将所有行用作一个组。而distance的值是一行(任意)的值。

答案 1 :(得分:0)

您需要嵌套查询或CTE,具体取决于您的RDBMS

首先计算2公里范围内的属性,然后根据该结果计算最大/最小价格,您也不需要having而是使用where clausule

SELECT MAX(price_feed) as max, MIN(price_feed) as min
FROM (
      SELECT price_feed
      FROM feed 
      WHERE 
           listing_type_feed = 'rental' 
      and property_type_feed IN ("Flat", "Apartament", "Penthouse", "Studio")      
      and SQRT( POW(69.1 * (latitude_feed - 51.542980), 2) + POW(69.1 * (-0.149323 - longitude_feed ) * COS(latitude_feed / 57.3), 2)) < 2
) as filter_properties