2013-08-11 3 views
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과 관련된 두 개의 시간대를 상상해 먼저 timeframe1이라는 2014-01-07에 시작하여 2014-03-28에 끝납니다. 두 번째는 2014-04-28에 timeframe2라는 존재이며 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` 

예 나는 HAVING이 악하다고 알고 있지만, 이제는 다른 방식으로 보입니다.

+0

당신은 조건을'@proposedstart <= end and @proposedend> = start'로 간소화 할 수 있습니다. [this answer] (http://stackoverflow.com/a/325964/390819) – GolfWolf

+0

@ w0lf를 참조하십시오. . . 그리고 그것은 근본적으로 질문에있는 것입니다. 이 대답은 잘못되었습니다. –

+0

@GordonLinoff 권리 – GolfWolf