对不起标题,我不知道如何正确解释,我会在这里试试。
我有4张桌子:
products(id, season_id(FK), year(4), brand_id(FK), price, ...)
seasons(id, name)
brands(id, name)
sales(id, season_id(FK), year(4), brand_id(FK), value(INT))
正如您已经猜到的那样,season_id
和brand_id
是FK,其中_id
。
现在,根据sales
表,产品将具有将要计算的价格。我的问题是可以使用sales
表的任意组合来计算价格。
我会尽快做一个更清楚的例子。
表products
行:
id: 1
,season_id: 3
,year: 2013
,brand_id 3
,price: 100.00
id: 2
,season_id: 3
,year: 2015
,brand_id 4
,price: 100.00
id: 3
,season_id: 4
,year: 2014
,brand_id 5
,price: 100.00
id: 4
,season_id: 5
,year: 2014
,brand_id 5
,price: 100.00
表sale
行:
season_id: 3
,year: 2013
,brand_id: 3
,value: 5%
season_id: 3
,year: 2014
,brand_id: null
,value: 10%
season_id: 4
,year: 2015
,brand_id: null
,value: 15%
season_id: null
,year: null
,brand_id: 5
,value: 20%
(所有字段都是可选字段,但如果有一个季节则必须有一年)
鉴于这个例子
第一个产品的价格将是100 - 5%(第3季+ 2013 +品牌3)
第二个产品的价格为100(匹配季节但不是年份)
第三个产品的价格为100(匹配季节但不是年份)
第四产品的价格将是100 - 20%(任何季节+任何一年+品牌5)
总而言之,我需要一种方法来了解每种产品应用的销售情况。优先事项是:
SeasonYearBrand > SeasonYear > Season > Year > Brand
现在我有一个查询来获取所有产品,另一个产品用于所有销售。在foreach
内部,我循环浏览所有产品,然后又在此处循环浏览所有销售的foreach
,最后我查看要应用的销售。
我知道这很令人困惑,但我想知道是否有更好的方法。每个页面有25个产品,我在sales
表中有20行,这样你就可以看出事情变得多么容易。
答案 0 :(得分:0)
您可以使用SQL执行此操作。使用子查询获得最佳匹配的销售记录。 Candiadates是三个字段匹配或为空的所有销售记录。您按匹配质量订购。我将一年的比赛排名最高,然后是季节然后品牌使用一些数学,我使用MySQL的功能来评估布尔表达式为1 f0r TRUE和0为FALSE。所以一年没有品牌的macth比没有年份的品牌匹配更好。然后取第一条记录,即最佳匹配。我希望将5%的值存储为0.5?否则你必须改变公式。最后,如果根本没有记录匹配,我将价格乘以1,从而保持价格。
select
id,
season_id,
year,
price *
coalesce
(
(
select 1 - s.value
from sales s
where coalesce(s.season_id, p.season_id) = p.season_id
and coalesce(s.year, p.year) = p.year
and coalesce(s.brand_id, p.brand_id) = p.brand_id
order by
(s.year is not null) * 4 +
(s.season_id is not null) * 2 +
(s.brand_id is not null) * 1 desc
limit 1
), 1
) as calc_price
from products p;