0

我正在研究在 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 年 1 月 7 日开始,到 2014 年 3 月结束-28。第二个,在 2014 年 4 月 28 日被称为时间框架 2,并在 2014 年 7 月 11 日结束。我还有两个与项目 3 相关的时间范围——第一个开始于 2015 年 9 月 7 日,结束于 2015 年 12 月 11 日。第二次从 2016 年 1 月 6 日开始,到 2016 年 3 月 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 有效。

4

1 回答 1

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`

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

于 2013-08-11T18:52:34.083 回答