2011-06-01 44 views
2

我有一個包含重複表達式的查詢。它可以寫得更緊湊嗎?刪除此MYSQL聯合查詢的重複

select id from `vacature_saved_searches` 
     where `saved_search_interval` = 1 and 
       DAYOFWEEK(CURDATE()) BETWEEN 2 AND 6 and 
       `last_processing_started_datetime` < CURDATE() - INTERVAL 1 HOUR 
UNION 
select id from `vacature_saved_searches` 
     where `saved_search_interval` = 2 and 
       DAYOFWEEK(CURDATE()) IN (2, 4, 6) and 
      `last_processing_started_datetime` < CURDATE() - INTERVAL 1 HOUR 
UNION 
select id from `vacature_saved_searches` 
     where `saved_search_interval` = 3 and 
       DAYOFWEEK(CURDATE()) = 3 AND 
       `last_processing_started_datetime` < CURDATE() - INTERVAL 1 HOUR 
UNION 
select id from `vacature_saved_searches` 
     where `saved_search_interval` = 4 and 
       DAYOFWEEK(CURDATE()) = 3 and 
       DAYOFMONTH(CURDATE()) BETWEEN 1 AND 7 and 
       `last_processing_started_datetime` < CURDATE() - INTERVAL 1 HOUR; 

回答

1

您可以使用DISTINCT組合和改寫使用查詢或條款,而不是工會:

select DISTINCT id from `vacature_saved_searches` 
    where ((`saved_search_interval` = 1 and DAYOFWEEK(CURDATE()) BETWEEN 2 AND 6) OR 
     (`saved_search_interval` = 2 and DAYOFWEEK(CURDATE()) IN (2, 4, 6)) OR 
     (`saved_search_interval` = 3 and DAYOFWEEK(CURDATE()) = 3) OR 
     (`saved_search_interval` = 4 and DAYOFWEEK(CURDATE()) = 3 and 
      DAYOFMONTH(CURDATE()) BETWEEN 1 AND 7)) 
     AND `last_processing_started_datetime` < CURDATE() - INTERVAL 1 HOUR; 
1

沒有那麼好。另外,對於這個確切的查詢,結果應該是相同的,但是如果4個查詢之間有重疊,你會在原始UNION中得到重複。

select id 
from `vacature_saved_searches` 
where `last_processing_started_datetime` < CURDATE() - INTERVAL 1 HOUR AND 
    ((`saved_search_interval` = 1 and DAYOFWEEK(CURDATE()) BETWEEN 2 AND 6) OR 
    (`saved_search_interval` = 2 and DAYOFWEEK(CURDATE()) IN (2, 4, 6)) OR 
    (`saved_search_interval` = 3 and DAYOFWEEK(CURDATE()) = 3) OR 
    (`saved_search_interval` = 4 and DAYOFWEEK(CURDATE()) = 3 and DAYOFMONTH(CURDATE()) BETWEEN 1 AND 7)) 
1

肯定。爲什麼工會當它的同一張桌子?

爲什麼不

select id from `vacature_saved_searches` 
    where 
((`saved_search_interval` = 1 and 
       DAYOFWEEK(CURDATE()) BETWEEN 2 AND 6) 
or 
(`saved_search_interval` = 2 and 
       DAYOFWEEK(CURDATE()) IN (2, 4, 6)) 
or 
(`saved_search_interval` = 3 and 
       DAYOFWEEK(CURDATE()) = 3) 
or 
(`saved_search_interval` = 4 and 
       DAYOFWEEK(CURDATE()) = 3 and 
       DAYOFMONTH(CURDATE()) BETWEEN 1 AND 7)) 
and `last_processing_started_datetime` < CURDATE() - INTERVAL 1 HOUR;