我有一张table 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` 不重要,只是时间间隔)。
换句话说, `stop_sale` 时间间隔对时间间隔执行减法运算 `rate` ,并且还绘制了最终结果集。
这在sql中是可能的吗?mysql呢?
如果是这样的话,查询的优化程度如何?用php处理这个操作更好吗?
1条答案
按热度按时间2fjabf4q1#
据我所知,仅仅使用sql查询是不可能做到这一点的。这可以在存储函数中迭代解决,但是没有干净的选项返回数据。最好的方法是返回数据的分隔字符串。
另一种方法是构建一个存储过程,定期填充结果数据表,并对其进行php查询。基本逻辑是:
传入起始数据值-起始日期。
使用查询创建临时表:
遍历临时表。
获取第一个“from”值。
获取下一个更大的“to”值
查找“from”值<current“to”值和>current“from”值,但是!='已在正在填充的结果表中的“from”值
如果找到,则将当前“from”值和“to”值-1天插入正在填充的结果表
否则,将当前“from”值和“to”值插入正在填充的结果表
这个基本的逻辑可以在php中完成,尽管它可能更复杂,因为您需要构建一个从上面的temp表查询返回的行数组,在上面运行逻辑,并构建一个结果数组。这比运行存储过程的效率要低,因为一旦运行存储过程,您只需要在比该运行更新的数据上再次运行它。因此,启动数据参数。
我希望这对你有帮助。