我有一个表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
with id=1
是如何根据stop_rate
与id=1
的时间间隔分成两个记录的(注意:id
不重要,只是时间间隔)。
换句话说,stop_sale
时间间隔对rate
的时间间隔执行减法操作,并使用最终的结果集绘制。
发布于 2018-01-05 18:55:48
据我所知,仅用SQL查询就无法做到这一点。这可以在存储的函数中迭代地解决,但是没有返回数据的干净选项。最好是返回数据的分隔字符串。
另一种方法是构建一个存储过程,定期填充结果数据的表,并对其进行php查询。基本逻辑是:
传入开始数据值-开始日期。
创建一个具有查询的临时表:
select * from rates
where from >= starting_date
union
select * from stop_sale
where from >= starting_date
order by from asc
这个基本逻辑可以在php中完成,尽管它可能更复杂,因为您需要构建从上面的temp表查询返回的行数组,在上面运行逻辑,并构建一个结果数组。这将比运行存储过程效率低,因为一旦运行存储过程,您只需要在比该运行更新的数据上再次运行它。因此,starting_data参数。
https://stackoverflow.com/questions/48117311
复制相似问题