我有一张表rate
,其结构如下(近似值):
CREATE TABLE `rate` (
`id` int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
`from` date NOT NULL,
`to` date NOT NULL
)
和(大致)相同的表stop_sale
:
CREATE TABLE `stop_sale` (
`id` int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
`from` date NOT NULL,
`to` date NOT NULL
)
考虑到,对于每一个,时间间隔是他们在各自的from
和to
字段之间所涵盖的天数范围:
我想以这样的方式查询这些表,即时间间隔不重叠,而是调整以使stop_sale
优先。
rates
| id | from | to |
| 1 | "2018-01-05" | "2018-01-31" |
| 2 | "2018-02-01" | "2018-02-15" |
stop_sale
| id | from | to |
| 1 | "2018-01-11" | "2018-01-20" |
| 2 | "2018-02-01" | "2018-02-10" |
期望的结果
| rate_id | from | to |
| 1 | "2018-01-05" | "2018-01-10" |
| 0 | "2018-01-11" | "2018-01-20" |
| 1 | "2018-01-21" | "2018-01-31" |
| 0 | "2018-02-01" | "2018-02-10" |
| 2 | "2018-02-11" | "2018-02-15" |
请注意rate
id=1
如何根据stop_rate
与id=1
的时间间隔拆分为两个记录(注意:id
s并不重要,只是时间间隔)。
换句话说,stop_sale
时间间隔在rate
的时间间隔执行减法运算,并且也用最终结果集绘制。
答案 0 :(得分:0)
据我所知,只有SQL查询无法做到这一点。这可以在存储的函数内迭代求解,但是没有干净的选项来返回数据。最好的方法是返回分隔的数据字符串。
另一种方法是构建一个存储过程,定期填充结果数据表并对其进行php查询。基本逻辑是:
传递起始数据值 - 开始日期。
使用查询创建临时表:
select * from rates
where from >= starting_date
union
select * from stop_sale
where from >= starting_date
order by from asc
这个基本逻辑可以在php中完成,虽然它可能更复杂,因为你需要构建从上面的临时表查询返回的行数组,运行它上面的逻辑,并构建一个结果数组。这比运行存储过程效率低,因为一旦运行存储过程,您只需要在比该运行更新的数据上再次运行它。因此,starting_data参数。
我希望这对你有所帮助。