2012-03-29 115 views
0

昨天,使用產品銷售報告的女士來找我一個問題。該報告會返回我們銷售的所有產品的列表,並列出特定時間段的計數。該報告在一個產品中的結果太多。產品「銷售頁面」一行也計入「無限銷售頁面」我們銷售的升級產品。MYSQL 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 

如果產品是「銷售頁面-無限」我可以把代碼添加逗號到它正在搜索的計劃名稱的末尾(例如「銷售頁面」)。由於問題出現在前面(我不能保證銷售頁面將始終是列表中的第一個),但這並不能解決此問題。但它可能會在未來避免類似的問題。

如果沒有重構數據庫以在計劃按數字列出(例如「P4,P16,P25」或「P1,P11」)或連接表中的列,我如何才能找到銷售頁面當我運行報告時無限銷售頁面在線上?

回答

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' 

但真正的答案是讓你有一個訂單表,其中有連接到order_ids和外鍵列的orderPlans表將資料標準化plan_ids。

+0

這甚至加快了!如果我被要求重寫這個項目,我**將會在所有地方正常化。但在那之前,潛在的副作用太多了。我沒有寫這個應用程序開始。 – 2012-03-29 16:23:54