Mysql 尝试考虑存储需要连接的日期范围的最佳数据库模式

Mysql 尝试考虑存储需要连接的日期范围的最佳数据库模式,mysql,join,left-join,inner-join,Mysql,Join,Left Join,Inner Join,引号中的表名 假设有用户试图销售产品。他们从所有产品销售id、产品id、用户id、总额、销售日期中赚取佣金。我想以某种方式存储他们基于特定日期的佣金率。例如,从2015-01-01到2015-01-15,用户将获得1%的收入,从2015-01-16到2015-01-28,用户将获得2%的收入,从2015-01-29,用户将获得3%的收入 我想运行一个查询,计算用户在一月份的佣金总额 我想运行一个查询,计算一月份的每日收入 我如何存储佣金率?一个想法是让一个表user\u commissions具

引号中的表名

假设有用户试图销售产品。他们从所有产品销售id、产品id、用户id、总额、销售日期中赚取佣金。我想以某种方式存储他们基于特定日期的佣金率。例如,从2015-01-01到2015-01-15,用户将获得1%的收入,从2015-01-16到2015-01-28,用户将获得2%的收入,从2015-01-29,用户将获得3%的收入

我想运行一个查询,计算用户在一月份的佣金总额

我想运行一个查询,计算一月份的每日收入

我如何存储佣金率?一个想法是让一个表user\u commissions具有id,user\u id,commission\u rate,from\u date,to\u date。如果佣金保持不变,那么很容易计算1的利率,在这种情况下,我会这样做:

选择sumtotal*0.01作为产品销售的总佣金,其中用户id=5,销售日期介于“2015-01-01”和“2015-01-31”之间

但由于佣金率是可变的,这就更复杂了。我需要以某种方式加入每笔销售的佣金表,以获得正确的总额

另一个问题是:

我如何存储用户当前没有到期日期的佣金率并将其包含在报告中?在我的例子中,从2015-01-29年起的3%。这没有结束日期。
您的表格结构非常合理,经常用于缓慢更改尺寸。在结构中存储生效日期和结束日期对于提高效率非常重要

存储最近佣金的截止日期的一种方法是使用NULL。这允许您执行以下操作:

select *
from commissions
where to_date is null
以获取最新记录

然而,更好的方法是使用一些遥远的日期,例如“9999-12-12”。这允许您通过以下方式获得最新佣金:

where curdate() between from_date and to_date

这是一个表达式,也可以使用从_日期到_日期的索引。

老实说,我会将用户佣金百分比和这些佣金的生效日期存储在一个表中

TABLE: COMMISSION
user_id, date_effective, commission
在另一个表中,我将存储销售数据。每次销售时,我都会保留销售人员在销售中获得的佣金。额外的奖金,你可以改变任何销售的佣金,像一个覆盖的排序

TABLE: SALE
sale_id, sale_date, user_id, sale_amount, commission
在程序中创建行时,可以使用以下查询获取正确的佣金率:

SELECT commission from commission WHERE user_id=[user's id] AND date_effective<=[sale date, today] ORDER BY date_effective ASC;
当试图在不完全匹配的日期加入时,MySQL左连接和SQL通常会变得非常棘手。回顾过去,基本上是这样。我现在正在与同样的问题作斗争,没有我刚才建议的奢侈的解决方案


这篇文章基于这样一个假设,即您不会通过DBMS直接与该数据库交互,而是通过应用程序进行交互。

谢谢您的回复,但这并不是我想要的。查询1和查询2与我在文章中提到的表结构是什么样的?