昨天,使用产品销售报告的女士来找我一个问题。该报告返回我们销售的所有产品的列表,其中包含给定时间段内的计数。该报告在一个产品中产生了太多结果。产品"销售页面"行也计算了#34;无限销售页面"我们销售的升级产品。
这是导致错误结果的代码:
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,")或者一个联接表格,我在运行报告时如何才能找到销售页面而不是无限销售页面?
答案 0 :(得分:1)
您可以尝试使用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的外键列。