MySQL多重过滤条件,仅在先前的过滤器未返回结果时才适用

时间:2019-05-15 06:59:48

标签: mysql sql

我有一个数据库表 Change ,其中有 change_id 用户名 change_生效日期列。我想在今天之前为用户检索最新的有效更改。如果今天之前没有对用户有效的更改,则应该检索将来的有效更改。 MySQL查询会是什么?

假设表格是

CHANGE_ID | USER_NAME | EFFECTIVE_DATE

1         BOB         2019-03-01
2         VIC         2019-04-01
3         MARK        2019-08-01
4         BOB         2019-08-01
5         VIC         2019-08-01
6         MARK        2019-09-01

查询应该返回,如果今天是2019-06-01

CHANGE_ID | USER_NAME | EFFECTIVE_DATE

1         BOB         2019-03-01
2         VIC         2019-04-01
3         MARK        2019-08-01

由于Mark没有今天以前的记录,所以应该检索他最近的将来记录。

注意:所有日期均为YYYY-MM-DD格式。

1 个答案:

答案 0 :(得分:0)

可以请您试试吗?根据您的逻辑,MARK应该返回2019-09-01。对吧?

SELECT A.USER_NAME ,
CASE 
    WHEN B.mx_date_b IS NULL THEN a.mx_date_a 
    ELSE b.mx_date_b 
END AS EFFECTIVE_DATE
FROM 
(
    SELECT USER_NAME,
    MAX(EFFECTIVE_DATE) mx_date_a
    FROM `Change`  
    GROUP BY USER_NAME
)A
LEFT JOIN 
(
    SELECT USER_NAME,
    MAX(EFFECTIVE_DATE) mx_date_b
    FROM `Change` 
    WHERE EFFECTIVE_DATE < DATE(NOW())
    GROUP BY USER_NAME
)B 
ON A.USER_NAME = B.USER_NAME