Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 寻找重叠_Mysql_Sql - Fatal编程技术网

Mysql 寻找重叠

Mysql 寻找重叠,mysql,sql,Mysql,Sql,我正在考虑在MySQL中开发一些东西。假设我在MySQL数据库中有一些“项目”和一些“时间框架”。许多“时间框架”可能属于每个“项目”。包含“时间表”的表有一个ID将其链接到每个项目任何类型的时间框架都不可能重叠-这很容易查询: SELECT * FROM `timeframes` WHERE end > proposedstart AND start < proposedend 假设项目表中有三个项目,分别称为项目1、项目2和项目3。假设我有两个与项目1相关的时间框架。第一个称为

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

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`