2011-06-02 90 views
1

我有1個輸入字段供用戶輸入商家名稱,城市和州或郵政編碼。我希望能夠撤回正確的數據,但現在我得到不正確的結果。試圖編寫查詢來查看業務和地址信息

例如,如果有人搜索「ERICS」,它會返回正常,但如果有人搜索「ERICS ROCHESTER MN」,它將返回ROCHESTER,MN的所有結果。我希望它在這種情況下不返回任何結果。順便說一句,我解析出數據,所以我在查詢中傳遞了多達4個值。商業名稱,城市,州,郵編。

如何修改我的查詢,以便它能給我正確的結果?我可以以某種方式檢查查詢哪些變量不爲空?

架構

業務

business_id | name | city  | state | zip 
1    TOMS  ROCHESTER  MN  55906 
2    BILLYs MINNEAPOLIS MN  55555 
3    ERICS LAX   WI  11111 

評級

​​

business_rating

br_id | business_id | rating_id 
1  1    1 
2  1    2 




select b.business_id, 
     b.name, 
     b.city, 
     b.state, 
     b.zip 
     count(br.business_id) num_ratings, 
     round(avg(br.quality_id),2) quality_rating, 
     round(avg(br.friendly_id),2) friendly_rating, 
     round(avg(br.professional_id),2) professional_rating 
from business b 
    Left Join business_rating br 
     On br.business_id = b.business_id 
    Left Join rating r 
     On r.rating_id = br.quality_id 
     And r.rating_id = br.friendly_id 
where (upper(b.business_name) like '%ERICS%' 
     and upper(b.city) like '%ROCHESTER%' 
     and upper(b.state) like '%MN%' 
     and upper(b.zip) like '') 
or (upper(b.city) like '%ROCHESTER%' 
    and upper(b.state) like '%MN%' 
    and upper(b.zip) like '') 
or (upper(b.city) like '%ROCHESTER%' 
    and upper(b.state) like '%MN%') 
or (upper(b.zip) like '') 
group by id 

回答

1

請注意您的WHERE條款 - 您要求四部分比賽OR三部分比賽等。這就是爲什麼三部分比賽(城市,州,郵編)正在退回。

處理此問題的最佳方法是將其發送到真正的搜索引擎, Solr的。

既然你沒有要求的最佳途徑,這是我回答你的問題:

Write 4 queries. 

一個部分的請求中一個查詢,兩部分的請求中一個查詢等。有你的代碼根據提供的參數數量來分支(或超載)。

這是假設,如果沒有「ERICS」,你會想要返回沒有結果,而不是在羅切斯特顯示一些其他酒吧。

哦,並且不要將函數(例如UPPER)應用到列 - 引擎將無法使用索引來滿足查詢。當然,使用未鏈接的LIKE模式也會阻止使用索引。真的,認真的,嘗試solr。

或者,試試這個...

此查詢創建根據您提供的非空字段的數量* MAX_SCORE *。

它計算匹配輸入的列數,即得分

然後它只顯示那些分數是最大值的行。

set @NAME = "erics"; 
set @CITY = "rochester"; 
set @STATE = "MN"; 

select id, 
case when @NAME is not null then 1 else 0 end + 
    case when @CITY is not null then 1 else 0 end + 
    case when @STATE is not null then 1 else 0 end + 
    case when @ZIP is not null then 1 else 0 end as max_score, 
case when @name is not null and name like concat("%", @NAME, "%") then 1 else 0 end + 
    case when @city is not null and city like concat("%", @CITY, "%") then 1 else 0 end + 
    case when @STATE is not null and state like concat("%", @STATE, "%") then 1 else 0 end + 
    case when @ZIP is not null and zip like concat("%", zip, "%") then 1 else 0 end as score 
from business 
having score = max_score; 

現在請安裝solr。

+0

我會看看solr。我也想到了4種不同的查詢,但我寧願將它放在1中。有一種方法可以做到這一點。 – Catfish 2011-06-02 23:58:44

+0

我最終解析了數據,然後創建了4個不同的where子句並將它們設置爲一個變量。根據我傳遞給該方法的任何變量,確定我在哪裏使用了從句。 – Catfish 2011-06-20 19:05:49