3

SQLite 3 で次のクエリを実行しようとしています。

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

しかし、次のエラーが表示されます。

SQLSTATE[HY000]: 一般エラー: 1 HAVING の前に GROUP BY 句が必要です

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;

同じ出力で、すべてのレコードが返されました。再確認しました-距離が正しく計算されています...このクエリの何が問題なのかわかりません。誰か助けてもらえますか?

4

4 に答える 4

2

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;
于 2010-01-20T04:59:42.843 に答える
1

ORDER BY を適用する前に、SELECT されたセットを削減することをお勧めします。私はこの種のアプローチを使用します:

SELECT * 
FROM Locations 
WHERE abs(Latitude - 51.123) < 0.12 
AND abs(Longitude - 0.123) < 0.34 
ORDER BY DISTANCE(Latitude, Longitude, 51.123, 0.123)

...ここで、(51.123, 0.123) は検索対象の中心緯度/経度ポイントであり、0.12 と 0.34 の値を使用して、検索を球面上の緯度/経度の正方形に絞り込みます。適切なサイズ (つまり、地球の球面上のその点における n キロメートル x n キロメートルの正方形。サイズは、場所の平均的な地理的分布によって異なります)。http://en.wikipedia.org/wiki/Longitudeの次数の長さの式を使用して、これらの値が地球の球面上の検索ポイントの位置に与えられるべきものを計算します。

于 2010-01-20T22:03:50.340 に答える
-1

これは構文エラーです。原因を使用している場合は、'group by' を使用する必要があります。

group by を使用したクエリは、("distance" >) を持つレコードを取得しています。これは、最初に一致するレコードを持つデータを取得し、原因によってレコードをフィルタリングした後に group by を実行するというデータベース ルールがあるためです。したがって、("distance" <) を持つデータを取得することはありません

私が間違っている場合は修正してください

于 2010-01-20T04:49:12.370 に答える
-3

Further to the correct flagged answer above, if you don't want to call DISTANCE function twice, refer to the alias in the WHERE clause, i.e:

 SELECT *, 
         DISTANCE(latitude, longitude, ?, ?) AS dist
    FROM COUNTRY c
   WHERE c.id NOT LIKE ?
     AND dist <= ?
ORDER BY dist;
于 2010-02-22T15:00:47.650 に答える