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