MySQL和PHP高级产品销售:检查多个字段

时间:2015-02-09 14:00:03

标签: php mysql database loops

对不起标题,我不知道如何正确解释,我会在这里试试。

我有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_idbrand_id是FK,其中_id

现在,根据sales表,产品将具有将要计算的价格。我的问题是可以使用sales表的任意组合来计算价格。

我会尽快做一个更清楚的例子。

products行:

  • id: 1season_id: 3year: 2013brand_id 3price: 100.00
  • id: 2season_id: 3year: 2015brand_id 4price: 100.00
  • id: 3season_id: 4year: 2014brand_id 5price: 100.00
  • id: 4season_id: 5year: 2014brand_id 5price: 100.00

sale行:

  • season_id: 3year: 2013brand_id: 3value: 5%
  • season_id: 3year: 2014brand_id: nullvalue: 10%
  • season_id: 4year: 2015brand_id: nullvalue: 15%
  • season_id: nullyear: nullbrand_id: 5value: 20%

(所有字段都是可选字段,但如果有一个季节则必须有一年)

鉴于这个例子

  • 第一个产品的价格将是100 - 5%(第3季+ 2013 +品牌3)

  • 第二个产品的价格为100(匹配季节但不是年份)

  • 第三个产品的价格为100(匹配季节但不是年份)

  • 第四产品的价格将是100 - 20%(任何季节+任何一年+品牌5)

总而言之,我需要一种方法来了解每种产品应用的销售情况。优先事项是:

SeasonYearBrand > SeasonYear > Season > Year > Brand

现在我有一个查询来获取所有产品,另一个产品用于所有销售。在foreach内部,我循环浏览所有产品,然后又在此处循环浏览所有销售的foreach,最后我查看要应用的销售。

我知道这很令人困惑,但我想知道是否有更好的方法。每个页面有25个产品,我在sales表中有20行,这样你就可以看出事情变得多么容易。

1 个答案:

答案 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;