这个问题与以下问题完全相同:

我正在尝试在 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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top