2012-04-13 3 views
0

다음 쿼리를 정리하고 조인으로 변환하는 데 도움이 될 수 있습니까?쿼리를 조인으로 변환

SELECT pd.id, pd.title, pd.vacation_type_ids, pd.auto_vacation_theme 
FROM property_details pd 
WHERE pd.company_id =247 
AND pd.status = "active" 
AND pd.id NOT 
IN (
    SELECT d.property_id 
    FROM property_discount d 
    WHERE (
    (
    d.start_date <= CAST( "2012-04-15" AS DATE) 
    AND d.end_date >= CAST( "2012-04-15" AS DATE) 
    AND d.start_date <= CAST( "2012-04-17" AS DATE) 
    AND d.end_date >= CAST( "2012-04-17" AS DATE) 
    ) 
    OR (
    d.start_date >= CAST( "2012-04-15" AS DATE) 
    AND d.start_date <= CAST( "2012-04-17" AS DATE) 
    ) 
    OR (
    d.end_date >= CAST( "2012-04-15" AS DATE) 
    AND d.end_date <= CAST( "2012-04-17" AS DATE) 
    ) 
) 
) 

내가 MySQL을 가진 전문가 내가

+0

tombom이 설명했듯이 WHERE 절은 엉망입니다. 이건 어때. 당신이 원하지 않는 것 대신에, 당신은 할인에서 찾을 것을 찾으려고합니다. 4/15 이상으로 시작하여 4/17 이전에 완료된 모든 직무를 원합니다. 그렇다면 결과는 "무시"하려는 속성입니다. 정확합니까? – DRapp

답변

0

뭔가 잘못이 모든 일이 나에게 아무 의미를 한 경우 미안하지 않다.

WHERE (
(
d.start_date <= CAST( "2012-04-15" AS DATE) 
AND d.end_date >= CAST( "2012-04-15" AS DATE) 
AND d.start_date <= CAST( "2012-04-17" AS DATE) 
AND d.end_date >= CAST( "2012-04-17" AS DATE) 
) 
OR (
d.start_date >= CAST( "2012-04-15" AS DATE) 
AND d.start_date <= CAST( "2012-04-17" AS DATE) 
) 
OR (
d.end_date >= CAST( "2012-04-15" AS DATE) 
AND d.end_date <= CAST( "2012-04-17" AS DATE) 
) 
) 

첫번째 블록

기본적 start_date <= '2012-04-17' AND end_date >= '2012-04-17' 감소 얻을 수있다. 이 경우는 기본적으로 start_date BETWEEN '2012-04-15' AND '2012-04-17' 인 두 번째 및 세 번째 블록에 의해 각각 처리됩니다. end_date BETWEEN '2012-04-15' AND '2012-04-17'.

OR 사이에 실제로 입력 하시겠습니까, 아니면 AND이 좋습니까?

DB 디자인에 대한 정보를 제공하지 않았으므로이 두 테이블 간의 다음 연결이 맞는지는 알 수 없습니다.

SELECT pd.id, pd.title, pd.vacation_type_ids, pd.auto_vacation_theme 
FROM property_details pd 
INNER JOIN property_discount d ON pd.id = d.property_id 
WHERE pd.company_id =247 
AND pd.status = 'active' 
(
d.start_date BETWEEN '2012-04-15' AND '2012-04-17' /*this is right when start_date is of type date, when it's datetime or timestamp you better write '2012-04-17 23:59:59', otherwise '2012-04-17 00:00:00' is assumed, which is basically not considering this date*/ 
OR 
d.end_date BETWEEN '2012-04-15' AND '2012-04-17' 
)