1

ポイントから一定の距離にある銀行のリストを取得しています

ICBC                        6805    119.86727673154
Bank of Shanghai            7693    372.999006839511
Bank of Ningbo              7626    379.19406334356
ICBC                        6790    399.580754911156
Minsheng Bank               8102    485.904900718796
Standard Chartered Bank     8205    551.038506011767
Guangdong Development Bank  8048    563.713291030103
Bank of Shanghai            7688    575.327270234431
Bank of Nanjing             7622    622.249663674778

ただし、各チェーンの1つの会場を取得したいだけです。

これまでのクエリ

SELECT name, id , (
GLength( LineStringFromWKB( LineString( `lnglat` , POINT( 121.437478728836, 31.182877821277 ) ) ) )
) *95000 AS `distance`
FROM `banks` 
WHERE (
lnglat != ""
)
AND (
published =1
)
HAVING (
distance <700
)
ORDER BY `distance` ASC

group by nameを使用すると、距離が範囲内に収まらないことが評価されるため、機能しません。つまり、700 mを超える距離に低いIDのICBCがある場合、2つのICBCが700 m以内にある場合でも、ICBCは結果に表示されません。だから私はこれgroup byが前に起こるので起こるhaving
のではないかと思いますそれとも別の解決策がありますか?

実際の列ではないため、距離チェックをどこに移動できませんでした#1054 - Unknown column 'distance' in 'where clause'

4

3 に答える 3

2

クエリ全体をテーブルとして選択し、その上でGroupByを実行します。

例えば

Select * FROM 
(SELECT name, id , (
GLength( LineStringFromWKB( LineString( `lnglat` , POINT( 121.437478728836, 31.182877821277 ) ) ) )
) *95000 AS `distance`
FROM `banks` 
WHERE (
lnglat != ""
)
AND (
published =1
)
HAVING (
distance <700
)
ORDER BY `distance` ASC) t
GROUP BY t.name
于 2011-08-10T23:36:23.017 に答える
0

これがあなたが探しているものであるかどうかはわかりません。最短距離で1つの銀行を取得するだけです。

SELECT banks.name, banks.id, banks_with_least_distance.distance
FROM banks JOIN
(
  SELECT name, min(
  GLength( LineStringFromWKB( LineString( `lnglat` , POINT( 121.437478728836, 31.182877821277 ) ) ) )
  *95000) AS `distance`
  FROM `banks` 
  WHERE (lnglat != "") AND (published =1) AND (GLength( LineStringFromWKB( LineString( `lnglat` , POINT( 121.437478728836, 31.182877821277 ) ) ) ) *95000 < 700)
  GROUP BY `name`
) AS banks_with_least_distance ON banks.name = banks_with_least_distance.name
ORDER BY banks_with_least_distance.distance DESC

編集:distancewhere句のinを実際の式に変更しました。

于 2011-08-10T23:41:02.883 に答える
0

GROUP BY条件がないため、サンプルが完成していることを確認しますか?700マイル以内の銀行が必要な場合は、それをWHERE状態にします。1つの銀行のみを報告する場合は、それをGROUPBYに入れます。SQLのバージョンによっては、エイリアスを使用するのではなく、GroupByでGlenghtを繰り返す必要がある場合があります。あるポイントから特定の距離にある銀行のリストを取得しているのではありません。位置を指定して銀行を取得し、特定のポイントからの距離を計算しています。計算された距離が700の銀行のみが必要であり、銀行が繰り返される場合は、1回だけリストする必要があります。

    SELECT name, id, (GLength( ...) AS [distance]
    FROM [banks] 
    WHERE [lnglat] != "" ... AND [distance] <700 
    Group By [name], [id], [distance] 
    ORDER BY [distance] ASC 
于 2011-08-10T23:48:54.550 に答える