我正在尝试创建一个将结合以下两个查询的查询。
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英里]
答案 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。