我正在研究在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有效。
答案 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是邪恶的,但我现在以其他方式看到了。