删除此MYSQL联合查询的重复项
我有一个包含重复表达式的查询。它能写得更紧凑些吗删除此MYSQL联合查询的重复项,mysql,union,Mysql,Union,我有一个包含重复表达式的查询。它能写得更紧凑些吗 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
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;
没那么好。同样,对于这个精确的查询,结果应该是相同的,但是如果这4个查询之间存在重叠,那么您将在原始联合中得到重复的结果
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))
当然。为什么是同一张桌子上的工会 为什么不
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;
您可以结合使用DISTINCT和REFORMATING查询来使用OR子句而不是UNION:
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;