2011-06-02 85 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