折扣组合表

时间:2013-06-15 07:36:55

标签: php mysql

我有桌子;类别,主题。

Category -> id, name, desc; 
Subject -> id, name, desc, category_id;

他们根据类别提供的科目数量的组合提供折扣。 例如。

Category Table (id, name)
1, Language
2, Cultural
3, Music

Subject table (id, name, category_id)
1, English, 1
2, Tamil, 1
3, Bharatham, 2
4, Violin, 3
5, Keyboard, 3

如果学生正在学习英语,泰米尔语,小提琴,则该组合为2种语言和1种音乐。同样,我们必须记录许多组合,每个组合都有不同的折扣金额。如何创建具有类别数量和折扣的组合表?

1 个答案:

答案 0 :(得分:0)

您有两个问题,即创建折扣表然后再使用它。我建议采用一种主要是标准化的方法,它涉及两个表:

create table Discounts (
    DiscountId int,
    DiscountRate float,
    NumCategories int
    . . .
)

create table DiscountCategories (
    DiscountCategoryId int,
    CategoryId int,
    MinCount int
)

第一个描述每个折扣,第二个调用类别。第一个也有“NumCategories”列。这是对严格规范化的偏离,但在查询中是一个很大的便利。

我假设您有一个名为StudentSubjects的表。要查找适用的折扣:

select s.StudentName, d.DiscountId
from (select s.StudentName, ss.CategoryId, count(*) as numCategories
      from StudentSubjects ss join
           Subjects s
           on ss.SubjectId = s.id
     ) s left outer join
     DiscountCategories dc
     on s.CategoryId = dc.CategoryId and
        s.NumCategories >= dc.MinCount left outer join
     Discounts d
     on dc.DiscountId = d.DiscountId
group by s.StudentName, d.DiscountId
having count(ss.CategoryId) = max(d.NumCategories)

第一个子查询按类别总结了学生课程。然后,它会找到每个主题的适用折扣。最终聚合确保折扣涵盖所有类别。