sql - SQLite SQL 查询的问题

标签 sql sqlite pdo having

我正在尝试在 SQLite 3 中运行以下查询:

SELECT *,
  DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
HAVING "distance" <= ?
ORDER BY "distance" ASC;

但我收到以下错误:

SQLSTATE[HY000]: General error: 1 a GROUP BY clause is required before HAVING

我不明白为什么 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;

相同的输出,返回所有记录。我已经仔细检查过 - 距离计算正确...我不知道这个查询出了什么问题,有人可以帮助我吗?

最佳答案

如果未指定 GROUP BY 子句,则无法指定 HAVING 子句。使用:

  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;

关于sql - SQLite SQL 查询的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2099090/

相关文章:

mysql - mysql中的相交或减号

mysql - mysql生成6位随机数

php - 删除不适用于 pdo

java - 如何避免在 Room Db 的表中重复输入数据?

javascript - PHP 解析 PDO Fetch 为 JSON

PHP、MSSQL、SQL SERVER、WAMP、PDO、Windows 身份验证

sql - 如何在django中使用sql语句?

sql - 查询功能花费的时间太长

android - SQLite、Android 中一个子字符串的多个变体中的任何一个的查询列

sqlite - 如何重置我的SQLite密码?