SQLite SQL 查询出现问题[重复]
题
这个问题与以下问题完全相同:
- SQLite - WHERE 子句和 UDF 4 个答案
我正在尝试在 SQLite 3 中运行以下查询:
SELECT *,
DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
HAVING "distance" <= ?
ORDER BY "distance" ASC;
但我收到以下错误:
SQLSTATE[HY000]:一般错误:1在拥有之前需要一组条款
我不明白为什么 SQLite 要我对结果进行分组,但我仍然尝试了以下操作:
SELECT *,
DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
GROUP BY "id"
HAVING "distance" <= ?
ORDER BY "distance" ASC;
我也尝试过这个:
SELECT *,
DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
GROUP BY "distance"
HAVING "distance" <= ?
ORDER BY "distance" ASC;
没有错误,但所有记录都已返回(即使是那些有 "distance" > ?
)。我也尝试这样做:
SELECT *,
DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
AND "distance" <= ?
ORDER BY "distance" ASC;
相同的输出,返回所有记录。我已经仔细检查过 - 距离计算正确......我不知道这个查询有什么问题,有人可以帮助我吗?
解决方案
你不能指定一个 HAVING
条款没有指定 GROUP BY
条款。使用:
SELECT *,
DISTANCE(latitude, longitude, ?, ?) AS dist
FROM COUNTRY c
WHERE c.id NOT LIKE ?
AND DISTANCE(c.latitude, c.longitude, ?, ?) <= ?
ORDER BY dist;
如果您不想多次调用 DISTANCE,可以使用子查询:
SELECT x.*
FROM (SELECT c.*,
DISTANCE(latitude, longitude, ?, ?) AS dist
FROM COUNTRY c
WHERE c.id NOT LIKE ?) x
WHERE x.dist <= ?
ORDER BY dist;
其他提示
更好(更快)的方法可能是在应用 ORDER BY 之前减少 SELECTed 集。我使用这种方法:
从位置中选择*,其中abs(纬度 - 51.123) < 0.12 AND abs(经度 - 0.123) < 0.34 按距离排序(纬度、经度、51.123、0.123)
...其中 (51.123, 0.123) 是您要搜索的相对于的中心纬度/经度点,0.12 和 0.34 的值用于将搜索范围缩小到球面上的纬度/经度正方形适当的尺寸(即地球球体上该点的 n 公里乘 n 公里的正方形,其大小取决于您所在位置的平均地理分布)。我使用的度数长度公式为 http://en.wikipedia.org/wiki/经度 计算出根据搜索点在地球球体上的位置应给出的这些值。
这是语法错误,当您使用having Cause时,您必须使用“group by”,
您使用 group by 的查询正在获取具有 ("distance" >) 的记录,因为数据库规则首先获取具有匹配记录的数据,然后在通过原因过滤记录后对其执行 group by 。所以你永远不会得到具有 ("distance" <) 的数据
如果我错了请纠正
除了上面正确标记的答案之外,如果您不想调用 DISTANCE 函数两次,请参阅 WHERE 子句中的别名,即:
SELECT *,
DISTANCE(latitude, longitude, ?, ?) AS dist
FROM COUNTRY c
WHERE c.id NOT LIKE ?
AND dist <= ?
ORDER BY dist;