我正在尝试创建一个将合并以下两个查询的查询。
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中,但它返回了一个语法错误,我不知道如何修复。我只是尝试删除已有查询和合并查询,但是它说它无法确定distance是什么。任何帮助都是非常感谢的。谢谢。
输出:大本营,名称,类型,wifi,距离2,夏令营XYZ,私人,1,4.44英里
发布于 2011-01-10 02:24:28
在未提供的信息中,露营地和标记表是如何相互关联的。我们需要这些信息才能知道如何加入这些表格。
同时,还需要GROUP (它的操作类似于GROUP聚合结果上的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子句中使用列ALIASes。我猜你知道这一点,也知道你可以用它们来拥有,这就是为什么你试图用它来代替它。要做到这一点,您必须通过查询将其重写为一个组:
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;只要营地是唯一的(因为其他值将来自这个id的唯一记录),这就可以工作了。
发布于 2011-01-10 02:23:49
它看起来应该是WHERE distance < 25,因为它适用于查询,如HAVING MAX(distance) < 25和其他聚合函数。
发布于 2011-01-10 02:35:34
我想这是值得一试的(只需将where子句从第二个sql添加到第一个)
SELECT
... AS distance
FROM campground
WHERE type='private' AND wifi = 1
HAVING distance < 25
ORDER BY distance LIMIT 0 , 20;https://stackoverflow.com/questions/4643178
复制相似问题