MYSQL like子句发现太多匹配

时间:2012-03-29 15:49:29

标签: mysql where-clause sql-like

昨天,使用产品销售报告的女士来找我一个问题。该报告返回我们销售的所有产品的列表,其中包含给定时间段内的计数。该报告在一个产品中产生了太多结果。产品"销售页面"行也计算了#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,")或者一个联接表格,我在运行报告时如何才能找到销售页面而不是无限销售页面?

1 个答案:

答案 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的外键列。