0

このクエリを実行しています

SELECT 
country, 
countries.code, 
countries.lat, 
countries.lng, 
countries.zoom, 
worldip.start, 
worldip.end 

FROM countries, worldip 
WHERE countries.code = worldip.code 
AND 
'91.113.120.5' BETWEEN worldip.start AND worldip.end 
ORDER BY worldip.start DESC

これらのフィールドを持つテーブルでは、

worldip           countries
--------------    ----------------
start             code
end               country
code              lat
country_name      lng
                  zoom

また、1つのIPで2つの異なる国で2つの結果が得られることもあります。理由がわかります

'91.113.120.5' BETWEEN worldip.start AND worldip.end 

10は9から11の間であるため、2つの異なる結果が返されますが、5から12もWHERE countries.code = worldip.code返されます。これを含めると、これを防ぐことができたと思います。しかし、そうではありません。

ORDER BY worldip.start DESCまた、IPアドレスが正確であるほど、リストの上位に表示されるため、機能しているように見えることも追加しました。ここでそれが機能している(または機能していない)ことがわかります。しかし、それは簡単な修正であり、私はそれを正しく行いたいと思います。

SQLは私にとって本当の弱点です。誰かが私が間違っていることを説明できますか?

4

1 に答える 1

2

まずは素敵なアプリ。私はフライトを探していました-私は価格比較が好きで、#ベースのリンクはありません。独自のgeoipデータベースを使用する代わりに、無料のgeolocatorサービスを試すことができます。それはさておき、MySQLの「IP」データ型のIPフィールドで比較できますか?これは、正しい順序を取得するのに役立つ場合があります。そうしないと、文字列として比較され、IPの長さが異なる場合などに問題が発生する可能性があります。

IPの整数表現では、<=および>=演算子を使用できます。

于 2009-10-04T12:56:23.447 に答える