英国の郵便番号の緯度/経度の値を検索するための、世界で最も単純なテーブルがあります (完全な英国の郵便番号データが読み込まれています)。
CREATE TABLE postcodes (
postcode char(7) NOT NULL,
lat double(10,6) NOT NULL,
lng double(10,6) NOT NULL,
KEY postcode (postcode)
)
「郵便番号」フィールドの郵便番号は、前半の最後の 2 桁、または 1 桁とスペースのいずれかです。それらがどのように一致するかの完全性にとってスペースは重要だと思います(??)。さらに、表示目的で郵便番号も引き出しているため、テーブル内のスペースを削除したくありません(そして、私は私はうるさいので、重複したフィールドは必要ありません!)。例:
'LE115AF', 'BS6 5EE', 'W1A 1AA', 'BS216RS', 'M3 1NH'
したがって、スペースがあるものとないものがあります。ほとんどは全体で 7 文字ですが、6 文字しかないものもあります。
とにかく、ポイントは、スペースの有無にかかわらず、部分的な郵便番号を含む郵便番号クエリをユーザーが入力できるようにして、入力文字列が有効な場合は常に一致するものを見つけられるようにすることです (つまり、郵便番号の全部または一部を入力しないでください)。テーブルには存在しません)。
これは私がこれまで行ってきた方法です(PHPの助けを借りて):
{...} WHERE `postcode` LIKE '" . str_replace(' ','%',$query) . "%' LIMIT 1
これは次の場合に適しています。
- データベースにスペースを含まない完全な郵便番号
- スペースが入力され、データベースに対応するスペースがある場合、またはクエリされた部分がスペースが発生する場所の手前で停止する場合の部分的な郵便番号 (たとえば、「W1A」は「W1A 1AA」と一致し、「M3 1」は「M3 1AR」と一致します) 」など)。
ただし、次のクエリでは機能しません。
- 「W1A1AA」は「W1A 1AA」と一致する必要があります
- 「BS65EE」は「BS6 5EE」と一致する必要があります
- 「BS65」は、データベースの最初の「BS6 5%」郵便番号、つまり「BS6 5AA」と一致する必要があります。
- 「M31」も「M3 1AR」と一致する必要があります
行の郵便番号フィールドにスペースがあるかどうかを解決するには、MySQL文字列関数の魔法を何らかの方法で実行し、それに応じてWHERE句のロジックを調整する必要があると思いますか? 誰かが最善のアプローチについてアドバイスを受けましたか? 私も理想的にしたい:
- MySQL ストアド プロシージャを避ける (インライン関数を推奨)
- PHP部分でもインライン文字列関数だけを行います