寻找重叠

时间:2013-08-11 18:19:30

标签: mysql sql

我正在研究在MySQL中开发一些东西。想象一下,我有一些项目'以及一些'时间框架'在MySQL数据库中。许多时间表'可能属于每个项目'。该表格包含'时间范围'有一个ID链接到每个项目。 '时限'任何形式的可能都不重叠 - 这很容易查询:

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

但是 - 我最好还是要返回以下内容 - 新的时间范围可能不会出现在&#39;项目中。这不是它自己的(由最早的&#39;时间框架和属于该项目的日期和最新的&#39;日期和该项目的日期)定义 - 但可能在两个时间框架之间出现&#39;项目&#39 ;.有什么方法可以从&#39;时间框架中查询这个问题。表格格式类似吗?

以下是说明

的输出
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)

想象一下,我在项目表中有三个项目,名为Project 1,Project 2和Project 3.想象一下,我有两个与项目1相关的时间框架。第一个,称为timeframe1,从2014-01-07开始,结束于2014年3月28日。第二个,名为timeframe2,生于2014-04-28,结束于2014-07-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有效。

1 个答案:

答案 0 :(得分:0)

抱歉,我的错误。忘记我之前写的内容。

编辑答案:

抱歉未经测试!

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`

是的,我知道HAVING是邪恶的,但我现在以其他方式看到了。