无法发现这两个查询之间的区别

时间:2013-12-30 17:58:26

标签: mysql sql

尝试清理一个长查询我已经提出了一个修改过的版本,但现在带有某些参数的旧查询返回6行,但我的版本没有返回。我一直在盯着我的眼睛发现差异,却找不到任何东西。以下是两个版本中具有相同参数集的WHERE子句:

丑陋(但工作)版本:

SELECT ... 
FROM table as a
WHERE 1=1 
and a.title LIKE '%Manager%' 
and a.status='Approved'  
and (a.effected_date<=now()) 
and ( 
    (DATE_ADD(a.effected_date, INTERVAL 30 DAY) >= now() AND a.is_hotjob=0) 
     or 
    (DATE_ADD(a.effected_date, INTERVAL 30 DAY) >= now() AND a.is_hotjob=1)
)

我已清理(但已损坏)的版本:

SELECT ...
FROM `table`  AS `a`
WHERE CONCAT(`a`.`title`, ' | ', `a`.`job_detail_section`) LIKE '%Manager%' AND 
`a`.`status` = 'Approved' AND 
`a`.`effected_date` <= '2013-12-30' AND 
(`a`.`effected_date` >= '2013-11-30' OR `a`.`is_hotjob` = '1')

2 个答案:

答案 0 :(得分:1)

你得到了最后的AND / OR:

`a`.`effected_date` <= '2013-12-30' OR 
(`a`.`effected_date` >= '2013-11-30' AND `a`.`is_hotjob` = '1')

编辑:重新格式化之后,答案看起来更像是:

SELECT ...
FROM `table`  AS `a`
WHERE CONCAT(`a`.`title`, ' | ', `a`.`job_detail_section`) LIKE '%Manager%' AND 
`a`.`status` = 'Approved' AND 
`a`.`effected_date` <= now() AND 
`a`.`effected_date` >= DATE_ADD(a.effected_date, INTERVAL 30 DAY)

可能:

AND `a`.`is_hotjob` IN (0,1)

答案 1 :(得分:0)

作为 -

的替代品
(DATE_ADD(a.effected_date, INTERVAL 30 DAY) >= now() AND a.is_hotjob=0) 
 or 
(DATE_ADD(a.effected_date, INTERVAL 30 DAY) >= now() AND a.is_hotjob=1)

您可以使用以下内容 -

(`a`.`effected_date` >= '2013-11-30' AND `a`.`is_hotjob` in (0, 1))

但根据附加信息,a.is_hotjob的值为01,则根本不需要在条件中提及它。所以基本上以下格式就足够了 -

`a`.`effected_date` >= '2013-11-30'