我有 1 个输入字段供用户输入公司名称、城市和州或邮政编码。我希望能够恢复正确的数据,但现在我得到的结果不正确。
例如,如果有人搜索“ERICS”,它会返回正常结果,但如果有人搜索“ERICS ROCHESTER MN”,它会返回明尼苏达州罗切斯特市的所有结果。在这种情况下,我希望它不返回任何结果。
顺便说一句,我正在解析数据,因此我在查询中最多传递了 4 个值。公司名称、城市、州、 zip 。
如何修改我的查询,以便它会给我正确的结果?我能以某种方式检查哪些变量不为空的查询吗?
架构
商业
business_id | name | city | state | zip
1 TOMS ROCHESTER MN 55906
2 BILLYs MINNEAPOLIS MN 55555
3 ERICS LAX WI 11111
评分
rating_id | rating
1 GOOD
2 BAD
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
最佳答案
注意您的 WHERE
子句 - 您要求四部分匹配 OR
三部分匹配,等等。这就是三部分匹配(城市, state, zip) 正在返回。
处理此问题的最佳方法是将其发送到真正的搜索引擎,例如解决方案。
既然你没有问最好的方法,这里是我对你问题的回答:
Write 4 queries.
一次查询单部分请求,一次查询两部分请求等。根据提供的参数数量让您的代码分支(或重载)。
这是假设,如果没有“ERICS”,您不希望返回任何结果,而不是在罗切斯特显示其他一些栏。
哦,不要将函数(例如 UPPER
)应用于您的列 - 引擎将无法使用您的索引来满足查询。当然,使用 unanchored 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。
关于mysql - 尝试编写查询以查看业务和地址信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6220801/