Sql 用have和WHERE查询

Sql 用have和WHERE查询,sql,mysql,subquery,in-subquery,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 d

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

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,但它返回了一个语法错误,我不知道如何修复。我试着删除have并合并查询,但它说它无法计算出距离是多少。感谢您的帮助。谢谢

输出:[campgroundid、名称、类型, 无线网络,距离][1,ABC营地,私人, 1,1.34英里][2号,私人XYZ营地,1, 4.44英里]


它看起来应该是距离<25的位置,就像用于查询MAXdistance<25和其他聚合函数一样。

未给出的信息是露营地和标记表之间的关系。我们需要这些信息来知道如何加入表

此外,HAVING requires groupby的操作与groupby的聚合结果上的WHERE子句类似。如果您没有聚合标记中的行,那么您需要的是位置,而不是位置

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

 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子句中使用列别名。我猜你知道这一点,也知道你可以在拥有中使用它们,这就是为什么你试图在何处交换拥有。要做到这一点,您必须以分组查询的形式重写:

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的唯一记录。

我想这是值得尝试的,只要将where子句从第二个sql添加到第一个sql即可

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

如果您的问题是使用连接逻辑从两个表中获取WHERE子句。 然后必须将该值包括在选择列表中。 例如, 选择USER.UserName,USER.UserId,LOC.id,LOC.lat,LOC.lon,3959*acos-cos-radians'123.1210022'*cos-radians-lat*cos-radians-lon-radians'21.200001'+sin-radians'123.1210022'*sin-radians-lat作为距离 从userlocation LOC,用户 距离小于“1”且LOC.id=USER.UserId 按距离排序 限制0,20

如果在Select列表中未找到USER.UserId,则无法在WHERE子句中找到LOC.id=USER.UserId

选择 钟楼, 3959*acos弧度37*cos弧度横向* 余弦弧度液化天然气-弧度-122+ 正弦弧度37*正弦弧度横向 作为距离 从露营地 其中type='private'和wifi=1 按距离限制0、20订购 距离小于25的


这可能行得通

您能给出所需输出的示例吗?这两个表之间有什么关系?添加了一些示例输出。还修复了一个查询,使其具有正确的表名,抱歉@Cybernate。我认为type='private'和wifi=1可以进入主查询。在这个版本中,它们似乎不是标记的属性,而是营地的属性。然而,从提供的附加信息来看,最终答案显然将涉及一个连接。OP需要提供有关标记和营地如何相关的附加信息。很抱歉造成混淆,我错过了编写表达式查询以获得错误的表名。标记实际上应该是露营地。因此,这两个查询指向同一个表。另外,当使用表达式查询表并使用where距离时,我在“distance”上得到一个无效的列名错误。如果没有子查询,则不能在where子句中使用列别名。这名男子必须工作。MySQL必须添加一个隐含的子查询。当我使用“WHERE distance”运行查询时,它在“WHERE子句”错误中为我提供了未知列“distance”。HAVING在MySQL中进行了扩展,以隐式添加一个列别名,该列别名可以像使用子查询一样使用WHERE子句。是的,它通过我一开始也是一个循环。请编辑你的答案和格式的代码,使其可读。你能评论你的解决方案吗?