MYSQL like 子句找到太多匹配项

标签 mysql where-clause sql-like

昨天,使用产品销售报告的女士向我提出了一个问题。该报告返回我们销售的所有产品的列表以及给定时间段内的计数。该报告在一种产品上有太多结果。产品“促销页”行也算作“无限促销页”,是我们销售的升级产品。

这是给出错误结果的代码:

Select count(WorkOrderId) as cnt from tblworkorder 
where PlanName LIKE '%{$row['PlanType']}%' and RecTime BETWEEN '$stime' and '$etime'

问题与通配符匹配有关。但是,由于我的前任设置数据库的方式,它是必要的。一次销售可以是多个产品,每个产品在 PlanName 列中按名称列出,并以逗号分隔。例如,

PlanName = Sale Page, Domain Name,
PlanName = Link, Unlimited Sale Page, 

虽然每行的正确答案是 1,但当前代码将返回:

Domain Name = 1
Link = 1
Sale Page = 2
Unlimited Sale Page = 1

如果产品是“Sale Page-Unlimited”,我可以让代码在其正在搜索的计划名称末尾添加一个逗号(例如“Sale Page,”)。由于问题出现在前面(并且我不能保证销售页面始终是列表中的第一个),因此这无法解决此问题。但它可能会防止将来出现类似问题。

如果不重组数据库以拥有按编号列出计划的列(例如“P4、P16、P25”或“P1、P11”)或连接表,我如何才能仅找到销售页面而不是无限当我运行报告时,销售页面上线?

最佳答案

您可以尝试使用 FIND_IN_SET这会翻译成类似的东西

SELECT 
    count(WorkOrderId) as cnt 
FROM tblworkorder 
WHERE FIND_IN_SET('{$row['PlanType']}',PlanName)>0 
  AND RecTime BETWEEN '$stime' and '$etime'

但真正的答案是标准化您的数据,以便您拥有一个订单表和一个 orderPlans 表,其中包含链接到 order_ids 和 plan_ids 的外键列。

关于MYSQL like 子句找到太多匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9928917/

相关文章:

mysql - 使用 Select Dateadd() sql server 减去年份

c# - SSH,连接并执行 mysql 查询

java - 使用 OneToOne 映射在 Spring Hibernate 中反序列化异常

MySQL 对连接表的查询条件

powershell - where-object 未能匹配哈希表元素

SQL like 多字符

sql - 如何从表中查找具有单引号字符串的字符串?

sql - 活跃用户跟踪、PHP session

php - 在不重新加载页面的情况下从 MYSQL 表更新值?

php - 使用php和mysql创建csv文件时有文件大小限制吗?