Mysql 寻找重叠
我正在考虑在MySQL中开发一些东西。假设我在MySQL数据库中有一些“项目”和一些“时间框架”。许多“时间框架”可能属于每个“项目”。包含“时间表”的表有一个ID将其链接到每个项目任何类型的时间框架都不可能重叠-这很容易查询:Mysql 寻找重叠,mysql,sql,Mysql,Sql,我正在考虑在MySQL中开发一些东西。假设我在MySQL数据库中有一些“项目”和一些“时间框架”。许多“时间框架”可能属于每个“项目”。包含“时间表”的表有一个ID将其链接到每个项目任何类型的时间框架都不可能重叠-这很容易查询: SELECT * FROM `timeframes` WHERE end > proposedstart AND start < proposedend 假设项目表中有三个项目,分别称为项目1、项目2和项目3。假设我有两个与项目1相关的时间框架。第一个称为
SELECT * FROM `timeframes` WHERE end > proposedstart AND start < proposedend
假设项目表中有三个项目,分别称为项目1、项目2和项目3。假设我有两个与项目1相关的时间框架。第一个称为时间表1,从2014年1月7日开始,到2014年3月28日结束。第二个称为时间框架2,于2014年4月28日结束,于2014年7月11日结束。我还有两个与项目3相关的时间表——第一个开始于2015-09-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-04-01至2014-04-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`
SELECT`projectId`
,MIN(`timeframeStart`)作为`start`
,MAX(`timeframeEnd`)作为`end`
从`时间表`
哪里有“projectd”!=@建议投影
按“projectd”分组
拥有@proposedstart=`projectMinMax`.`start`
是的,我知道拥有是邪恶的,但我现在看到了另一种方式。请发布这两个查询的结果:
描述项目
和描述时间范围
@FrankOlschewski我现在就编辑原始帖子。@adamcopard。我搞不懂你要什么。你能提供一些示例数据和你想要的结果吗?@GordonLinoff我在原始问题中添加了一些数据。你可以将条件简化为@proposedstart=start
。请参阅@w0lf。而这恰恰是问题的根本所在。这个答案是错误的。
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`