gpt4 book ai didi

mysql - 寻找重叠

转载 作者:行者123 更新时间:2023-11-30 01:24:27 26 4
gpt4 key购买 nike

我正在考虑在 MySQL 中开发一些东西。想象一下,我在 MySQL 数据库中有一些“项目”和一些“时间表”。许多“时间范围”可能属于每个“项目”。包含“时间范围”的表有一个将其链接到每个项目的 ID。任何类型的“时间范围”都不能重叠 - 这很容易查询:

SELECT * FROM `timeframes` WHERE end > proposedstart AND start < proposedend

但是 - 我理想地希望返回以下内容 - 新的时间范围可能不在不属于其自己的“项目”中(由属于该项目的最早“时间范围”日期和最新“时间范围”日期定义属于该项目) - 但可能出现在其自己的“项目”的两个时间范围之间。有什么方法可以从“时间范围”表中以类似的格式查询这个吗?

这是描述的输出

mysql> DESCRIBE projects;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| projectID | int(11) | NO | PRI | NULL | auto_increment |
| projectName | varchar(225) | NO | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> DESCRIBE timeframes;
+----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+----------------+
| timeframeID | int(11) | NO | PRI | NULL | auto_increment |
| projectID | int(11) | NO | | NULL | |
| timeframeName | varchar(225) | NO | | NULL | |
| timeframeStart | date | NO | | NULL | |
| timeframeEnd | date | NO | | NULL | |
+----------------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

假设我的项目表中有三个项目,分别称为项目 1、项目 2 和项目 3。假设我有两个与项目 1 关联的时间范围。第一个时间范围称为时间范围 1,开始于 2014-01-07,结束于2014年3月28日。第二个称为 timeframe2,于 2014 年 4 月 28 日开始,于 2014 年 7 月 11 日结束。我还有两个与项目 3 相关的时间范围 - 第一个时间范围于 2015 年 9 月 7 日开始,于 2015 年 12 月 11 日结束。第二个开始于2016-01-06,结束于2016-03-18。现在 - 假设我想添加与项目 2 相关的时间范围。它可能不是 2014-01-07 和 2014-07-11 之间的任何日期,也不是 2015-09-07 和 2016-03-18 之间的任何日期。因此,即使项目 2 的时间范围可能介于项目 1 或 3 的两个时间范围之间,我也不希望这种情况发生。例如,项目 2 中任何时间范围的可接受值为 2013-12-12 至 2014-01-06、2014-07-12 至 2015-09-06 或某个更窄的范围。我不希望 2014 年 4 月 1 日到 2014 年 4 月 27 日等时间范围对项目 2 有效。但是,这些日期可能仅对项目 1 有效。

最佳答案

抱歉,我的错误。忘记我之前写的东西了。

编辑后的答案:

抱歉,未经测试!

SELECT `projectId`
, MIN(`timeframeStart`) AS `start`
, MAX(`timeframeEnd`) AS `end`
FROM `timeframes`
WHERE `projectId` != @proposedprojectid
GROUP BY `projectId`
HAVING @proposedstart <= `projectMinMax`.`end`
AND @proposedend >= `projectMinMax`.`start`

是的,我知道拥有是邪恶的,但我现在看到了不同的方式。

关于mysql - 寻找重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18175151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com