2013-08-11 6 views
0

Я занимаюсь разработкой чего-то в MySQL. Представьте, что у меня есть некоторый «проект» и некоторые «таймфреймы» в базе данных MySQL. Многие «таймфреймы» могут принадлежать каждому «проекту». Таблица, содержащая «таймфреймы», имеет идентификатор, связывающий его с каждым проектом. «временные рамки» любого рода не могут перекрывать друг друга - и это легко для запроса:Поиск Overlaps

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) 

Представьте У меня есть три проекта в таблице проектов, под названием Project 1, Проект 2 и Проект 3. Представьте себе, что у меня есть два временных рамок, связанных с проектом 1. сначала называемый timeframe1, начинается в 2014-01-07 и заканчивается на 2014-03-28. Второй, называемый временными рамками2 на 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

Пожалуйста, разместите результаты этих двух запросов: 'DESCRIBE project' и' DESCRIBE timeframes' –

+0

@FrankOlschewski. Теперь я отредактирую исходный пост. – etoipi

+0

@AdamCoppard. , , Я не могу понять, о чем вы просите. Можете ли вы предоставить некоторые примеры данных и результаты, которые вы хотите? –

ответ

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` 

Да, я знаю, что ЗЛО, но теперь я вижу другой путь.

+0

вы можете упростить условие для '@proposedstart <= end и @proposedend> = start'. См. [Этот ответ] (http://stackoverflow.com/a/325964/390819) – GolfWolf

+0

@ w0lf. , , И это происходит в основном в вопросе. Этот ответ неверен. –

+0

@ GordonLinoff right – GolfWolf