0

これが私のクエリです

select * from a_table where  
(19.1181753366684 between minlatitude and maxlatitude ) and (72.8504168987274 between minlongitude and maxlongitude) or
 (19.1181043770386 between minlatitude and maxlatitude ) and (72.8506743907928 between minlongitude and maxlongitude) or
 (19.1178306753238 between minlatitude and maxlatitude ) and (72.8506422042847 between minlongitude and maxlongitude) or
(19.1174454647353 between minlatitude and maxlatitude ) and (72.8505992889404 between minlongitude and maxlongitude) or
(19.1169791559797 between minlatitude and maxlatitude ) and (72.8505349159241 between minlongitude and maxlongitude) or
(19.1159857112009 between minlatitude and maxlatitude ) and (72.8504061698914 between minlongitude and maxlongitude) or
(19.1156309080473 between minlatitude and maxlatitude ) and (72.8503739833832 between minlongitude and maxlongitude) or
(19.1152862413976 between minlatitude and maxlatitude ) and (72.8502130508423 between minlongitude and maxlongitude)

条件の間の where 句で使用している値の順に結果セットを並べ替えたいと思います。だから私の結果セットは順番になります

19.11817534
19.11810438
19.11783068
19.11744546
19.11697916
19.11598571
19.11563091

それは可能ですか?

ありがとう、リズワン

4

5 に答える 5

1

選択した順序で実行される複数のクエリに分割する以外に、それを行う方法はないと思います。

問題は、ソートする実際のフィールドがないこと、または結果セットのレコードに関連付ける方法が WHERE 句の条件に関連付けられていないことです (実際には複数の条件に一致する可能性があります)。

別の方法として、次のようなフィルター データの一時メモリ テーブルを作成することもできます。

id   latitude          longitude
1    19.1181753366684  72.8504168987274
2    19.1181043770386  72.8506743907928
...

テーブルの結合に対する then クエリ:

SELECT a_table.*, temp_table.id
FROM
a_table INNER JOIN temp_table
  ON temp_table.latitude BETWEEN a_table.minlatitude AND a_table.maxlatitude
  AND temp_table.longitude BETWEEN a_table.minlongitude AND a_table.maxlongitude
ORDER BY temp_table.id ASC

明らかに、 のすべての最小/最大緯度/経度フィールドにインデックスがあることを確認してくださいa_table

ここで重複をどのように処理したいのかわかりません(SELECT DISTINCT主キーが何であれ、行う必要があるかもしれませんa_table

于 2013-04-03T21:14:02.947 に答える
0

句を使用しORDER BYて順序を設定できます。列が緯度と呼ばれる場合は、使用します

ORDER BY latitude

ループから WHERE 句を生成している場合は、CASE ステートメントを使用することもできます

ORDER BY CASE
  loop
    WHEN latitude = 19.11817534 THEN 1 --change the two values dynamically. 1 would be a counter
  end loop
ELSE 999 END
于 2013-04-03T21:10:31.923 に答える
0
SELECT  *
FROM    (
        SELECT  19.1181753366684 AS lat, 72.8504168987274 AS lon, 1 AS no
        UNION ALL
        SELECT  19.1181043770386 AS lat, 72.8506743907928 AS lon, 2 AS no
        UNION ALL
        ...
        ) p
JOIN    a_table a
ON      p.lat BETWEEN a.minlatitude AND a.maxlatitude
        AND p.lon BETWEEN a.minlongitude AND a.maxlongitude
ORDER BY
        no
于 2013-04-03T21:14:40.563 に答える