0

バス停でいっぱいのテーブルがあります。各停留所には、line_id方向、および座標(緯度と経度) があります。

クエリで各行/方向の最寄りの停留所を返したいと思っています。

SELECT * from stops GROUP BY CONCAT(line_id, direction)

そのクエリは、期待どおりに停車地をグループ化します。これはトリッキーな他の部分です (最寄りの停留所を返す)。なぜなら、私は (ここでいくつかの変数を置き換えました) を使用してその場で距離を計算しているためです。

SQRT(POW(111.1819*(45.54182-lat),2)+POW(64.7938007101048*(-73.62934-lng),2))

INNER JOIN を実行しようとしましたが、うまくいきませんでした (距離式を置き換えました):

SELECT distance-formula as distance1, s1.* from stops s1 INNER JOIN 
(SELECT MIN(distance-formula) AS distance2, line_id, direction FROM stops GROUP BY CONCAT(line_id, direction)) s2 
ON (s1.line_id = s2.line_id AND s1.direction = s2.direction AND s1.distance1 = s2.distance2)

しかし、「on clause」エラーで不明な列「distance1」が引き続き発生します。

私は他のオプションを調べましたが、距離がクエリ内で計算されるという事実は、本当の契約破りのようです. 私のオプションは何ですか?クエリをできるだけ速くする必要があります。

4

1 に答える 1

0

未テスト:

SELECT * FROM (SELECT distance-formula as distance1, line_id, direction from stops) s1 INNER JOIN (SELECT MIN(distance-formula) AS distance2, line_id, direction FROM stops GROUP BY CONCAT(line_id, direction)) s2 ON (s1.line_id = s2.line_id AND s1.direction = s2.direction AND s1.distance1 = s2.distance2)

または(これもテストされていません):

SELECT distance-formula as distance1, s1.* from stops s1 INNER JOIN (SELECT MIN(distance-formula) AS distance2, line_id, direction FROM stops GROUP BY CONCAT(line_id, direction)) s2 ON (s1.line_id = s2.line_id AND s1.direction = s2.direction AND s1.distance - formula = s2.distance2)

最初の例のようなサブクエリでない限り、where または on 句でエイリアス distance1 を使用することはできません。

また、計算を高速化するために、平方根を取る必要はありません。なぜなら、sqrt(x) < sqrt(y) は x < y を意味するからです。

于 2011-03-30T05:18:12.480 に答える