mysql - 尝试编写查询以查看业务和地址信息

标签 mysql

我有 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/

相关文章:

mysql - 保留计算列来计算面积?

mysql - 在大型数据库MySQL中多次搜索最有效的方法是什么

php - CSV LOAD DATA INFILE 中出现解析错误

php - 如何从数字中删除点?

php - 动态检查 mySQL 数据库以查看当前时间是否已超过存储在数据库中的日期时间

php - 如何通过与cakephp表中的旧数据进行比较来插入和删除多行?

mysql - Qt 库 'mysql' 未定义

mysql - 无法启动 mySQL "mysqld: Too many arguments (first extra is ' 启动')。”

php - phpMyAdmin 中缺少设置图标和注销

mysql - 为每个键值对选择前 n 行