鍍金池/ 問答/PHP  數(shù)據(jù)庫/ 根據(jù)省市區(qū)搜索內(nèi)容, 如當(dāng)前級別沒有, 則搜索上一級內(nèi)容?

根據(jù)省市區(qū)搜索內(nèi)容, 如當(dāng)前級別沒有, 則搜索上一級內(nèi)容?

有一個需求, 需要根據(jù)始發(fā)地目的地去搜索對應(yīng)的運(yùn)輸公司, 始發(fā)地目的地需要選擇省市區(qū)(縣), 如果指定的地區(qū)沒有對應(yīng)的運(yùn)輸公司, 則給出上一級的運(yùn)輸公司。

例如:
搜索 廣東省廣州市白云區(qū)浙江省杭州市西湖區(qū) 的運(yùn)輸公司,
假如上面沒有匹配的,那么就搜索廣東省廣州市白云區(qū)浙江省杭州市 的運(yùn)輸公司;
假如上面沒有匹配的,那么就搜索廣東省廣州市浙江省杭州市 的運(yùn)輸公司;
假如上面沒有匹配的,那么就搜索廣東省廣州市浙江省 的運(yùn)輸公司;
假如上面沒有匹配的,那么就搜索廣東省浙江省 的運(yùn)輸公司;

目前的想法是把這些數(shù)據(jù)放在一個表里,根據(jù)始發(fā)地目的地的省市區(qū)(縣)6個條件去搜索, 然后做幾次判斷,直至搜索出結(jié)果。

正在尋找一個更優(yōu)的解決方案,求大佬們指點(diǎn)。建表和代碼方面,使用的是mysql、php。

回答
編輯回答
單眼皮

我不是大佬,我來說說我的想法吧。

首先是地區(qū)表示,你知道有種官方的編碼叫做行政區(qū)劃代碼嗎?這個在民政部可以查到,不過沒有格式化的數(shù)據(jù)。你也可以找網(wǎng)上別人已經(jīng)整理好的地區(qū)庫。

我們可以把代碼存放到數(shù)據(jù)庫中,也可以寫到文件中,這就看你自己了。

就拿你的例子來說,廣東省廣州市白云區(qū)的代碼是440111,浙江省杭州市西湖區(qū)是330106。

其實代碼很好理解,每兩位數(shù)分別代表省、市、縣。

44就是廣東省,的33就是浙江省。
01在廣東省下就是廣州市,在浙江省下就是杭州市。

表示上級地區(qū)的,是在后面補(bǔ)0足6位。
比如廣東省就是440000,廣東省廣州市就是440100。

所以我們保存某地區(qū)的公司時,只要把對應(yīng)的代碼存起來就行了。

比如公司表:
id name district
1 廣東省1公司 440000
2 廣東省2公司 440000
3 廣東省廣州市白云區(qū)公司 440111

在網(wǎng)頁地區(qū)選擇中,返回的value只要對應(yīng)價格兩位就夠了。

比如sheng=44&shi=01&xian=11

我們處理時補(bǔ)出三個代碼
440000、440100和440111

然后我們直接查找公司表

SELECT * FROM company WHERE district=440000 OR district=440100 OR district=440111;

然后返回結(jié)果,我們再一一檢查就行了。

當(dāng)然,可能公司很多,一次返回的結(jié)果太多了,我們可以先查詢440111的,有結(jié)果就返回,沒有就再查詢440100的,以此類推。

甚至,我們能在SQL中就完成這個操作

SELECT
  CASE
    WHEN EXIST(SELECT * FROM company WHERE district=440111) THEN (SELECT * FROM company WHERE district=440111)
    WHEN EXIST(SELECT * FROM company WHERE district=440100) THEN (SELECT * FROM company WHERE district=440100)
    ELSE (SELECT * FROM company WHERE district=440000)
  END;

當(dāng)然,你不想用地區(qū)代碼,想要自己編碼,甚至直接保存中文也是可以的,操作都是類似的。

以上代碼手機(jī)輸入,未經(jīng)過驗證,請自行搜索相關(guān)內(nèi)容理解后使用。

2017年5月10日 22:27