3

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

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, name, type, wifi, distance] [1,camp ABC, private, 1, 1.34 mi] [2,camp XYZ, private, 1, 4.44 mi]

4

5 回答 5

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 子句中使用列别名。我猜你知道这一点,也知道你可以在 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 的唯一记录)。

于 2011-01-10T02:24:28.773 回答
0

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

于 2011-01-10T02:23:49.710 回答
0

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

SELECT 
  ... AS distance 
FROM campground 
WHERE type='private' AND wifi = 1
HAVING distance < 25 
ORDER BY distance LIMIT 0 , 20;
于 2011-01-10T02:35:34.090 回答
0

SELECT campgroundid, ( 3959 * acos( cos( 弧度(37) ) * cos( 弧度( lat ) ) * cos( 弧度( lng ) - 弧度(-122) ) + sin( 弧度(37) ) * sin( 弧度( lat ) ) ) ) AS distance from campground WHERE type='private' AND wifi = 1 ORDER BY distance LIMIT 0 , 20 HAVING distance < 25

这可能有效

于 2014-02-17T12:27:26.577 回答
-1

如果您的问题是从两个具有 JOIN 逻辑的表中获得 WHERE 子句。然后您必须在 SELECT 列表中包含该值。例如,SELECT USER.UserName, USER.UserId, LOC.id, LOC.lat, LOC.lon, (3959 * acos( cos( 弧度('123.1210022') ) * cos( 弧度( lat ) ) * cos( 弧度( lon ) - 弧度 ('21.200001') ) + sin( 弧度('123.1210022') ) * sin( 弧度( lat ) ) ) 作为距用户位置 LOC 的距离,用户 USER HAVING 距离 < '1' AND LOC.id = USER.UserId ORDER BY distance LIMIT 0 , 20

如果您错过了 Select 列表中的 USER.UserId,您将无法在 WHERE 子句中设置 LOC.id = USER.UserId。

于 2012-12-04T13:54:58.293 回答