2012-04-13 42 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子句是一团糟。这个怎么样。而不是你不想要的东西,你试图在折扣中找到什么被排除在外。看起来,你希望任何发现STARTED至少为4/15的工作,并且是在4/17或之前完成的。如果是这样,这些是您想要从结果中“忽略”的属性。这是否准确? – DRapp 2012-04-13 13:28:25

回答

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

您没有提供关于您的数据库设计的信息,所以我只能猜测,如果这两个表之间的以下连接是正确的。

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' 
)