查询HAVING和WHERE

时间:2011-01-10 02:15:31

标签: sql mysql subquery in-subquery

我正在尝试创建一个将结合以下两个查询的查询。

SELECT 
  campgroundid, 
  ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * 
    cos( radians( lng ) - radians(-122) ) + 
    sin( radians(37) ) * sin( radians( lat ) ) ) ) 
  AS distance 
FROM campground 
HAVING distance < 25 
ORDER BY distance LIMIT 0 , 20;

SELECT * FROM campground WHERE type='private' AND wifi = 1

我尝试将它们放入IN但它返回了语法错误我无法弄清楚如何修复。我试图删除HAVING并组合查询,但后来它说它无法弄清楚distance是什么。任何帮助表示赞赏。感谢。

  

输出:[campgroundid,名称,类型,   wifi,距离] [1,营ABC,私人,   1,1.34英里] [2,营地XYZ,私人,1,   4.44英里]

5 个答案:

答案 0 :(得分:3)

未提供的信息包括露营地和标记表的相关性。我们需要该信息才能知道如何加入表格。

此外,HAVING需要GROUP BY(它在GROUP BY的聚合结果上像WHERE子句一样运行)。如果您没有聚合标记中的行,则需要WHERE,而不是HAVING。

猜测,你想要这样的东西:

 SELECT id (expression) as distance FROM markers
      WHERE distance < 25 AND 
        campground_id IN (SELECT id FROM campgrounds WHERE type = 'private' AND wifi = 1)

编辑:反映只有一个表格的新信息。

您不能在WHERE子句中使用列ALIASes。我猜你知道这一点,并且知道你可以在HAVING中使用它们,这就是为什么你试图用HAVING代替WHERE。为此,您必须重写为GROUP BY查询:

SELECT campgroundid, name, private, wifi, 
   ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * 
    cos( radians( lng ) - radians(-122) ) + 
    sin( radians(37) ) * sin( radians( lat ) ) ) ) 
    AS distance 
FROM campground 
GROUP BY campgroundid 
HAVING distance < 25 AND type='private' AND wifi = 1
ORDER BY distance LIMIT 0 , 20;

只要campgroundid是唯一的(因为其他值将来自此id的唯一记录),这将有效。

答案 1 :(得分:0)

它看起来应该是WHERE distance < 25,因为HAVING适用于HAVING MAX(distance) < 25和其他聚合函数等查询。

答案 2 :(得分:0)

我想这值得尝试(就像将第二个sql中的where子句添加到第一个一样简单)

SELECT 
  ... AS distance 
FROM campground 
WHERE type='private' AND wifi = 1
HAVING distance < 25 
ORDER BY distance LIMIT 0 , 20;

答案 3 :(得分:0)

选择   campgroundid,   (3959 * acos(cos(弧度(37))* cos(弧度(纬度))*     cos(弧度(lng) - 弧度(-122))+     sin(弧度(37))* sin(弧度(纬度))))   距离 从露营地 WHERE type ='private'AND wifi = 1 ORDER BY距离LIMIT 0,20 距离< 25

这可能有用

答案 4 :(得分:-1)

如果您的问题是从具有JOIN逻辑的两个表中获取WHERE子句。 然后,您必须在SELECT列表中包含该值。 例如, SELECT USER.UserName,USER.UserId,LOC.id,LOC.lat,LOC.lon,(3959 * acos(cos(弧度('123.1210022'))* cos(弧度(纬度))* cos(弧度(lon)) - 弧度('21 .200001'))+ sin(弧度('123.1210022'))* sin(弧度(纬度))))AS距离 FROM userlocation LOC,用户USER 距离< '1'和LOC.id = USER.UserId 按距离排序 限制0,20,

如果您错过了选择列表中的USER.UserId,您将无法在WHERE子句中使用LOC.id = USER.UserId。