2012-05-29 58 views
0

我有個城市的名單,有許多拼寫選項之一爲每個城市搜索的名稱(即:新紐約,紐約市,紐約州,紐約市)由許多拼寫選項

在期權數量不是恆定的,可以在城市之間變化。

現在我有一個cities表看起來像(破折號,逗號等被移除之前插入到alternative_names列:

| id |     name     |   alternative_names   | 
------------------------------------------------- 
| 1 |   New-York | ny,new york, nyc    | 
| 2 |  New Jersey | new jersey,jersey,nj   | 
當用戶輸入例如 NYCNew Yo

- 他應該得到新紐約

我可以REGEXLIKE '%query%'做到這一點,但表中包含城市的數千名,這將是非常沒有效率。

所以 - 是否有更好的方法來執行這種搜索大型分貝?

感謝先進!

+2

考慮規範你的表。 – triclosan

回答

1

獨立alternative_names到一個新表:

city_alternative_names 
---------------------- 
id 
city_id 
name 

和查詢該表得到「官方」城市名。

SELECT c.name 
FROM city c 
LEFT JOIN city_alternative_names cn ON c.id=cn.city_id 
WHERE cn.name='nyc' 
1

在db設計中查看關於Multi value attribute的文章。

+0

我希望沒有鏈接表...似乎沒有其他好的選擇,謝謝:-) –

0

我會更改數據庫設計以使每列只有一個拼寫選項的三列表。然後你可以利用數據庫選擇。如果你的數據庫是這樣的:

| id | city_id | name  | alternative_names | 
------------------+------------+------------------------ 
| 1 |  1 | New-York | ny     | 
| 2 |  1 | New-York | new york    | 
| 3 |  1 | New-York | nyc     | 
| 5 |  2 | New Jersey | new jersey   | 
| 6 |  2 | New Jersey | jersey    | 
| 6 |  2 | New Jersey | nj     | 

然後,你可以寫一個簡單搜索這樣的:

SELECT city_id, name 
FROM cities 
WHERE LOWER(name) = LOWER($1) 
OR LOWER(alternative_name) = LOWER($1) 

,或者甚至更好,他們分成兩個表城市(ID,姓名)和ALT_CITIES( city_id,alt_name)和JOIN查詢。