In my database there are users that have permanent or limited access.
status: 1 = active
status: 2 = blocked
If access is limited, there's a date from when till when it is valid. The problem is that the WHERE-condition ignores the CASE.
In this example I want only users that have status 2 (=blocked).
SELECT `id`,
`username`,
CASE
WHEN (`status` = 1 AND `valid` = 'limited' AND (`valid_from` > CURDATE() OR `valid_till` < CURDATE() ) ) THEN 2
WHEN (`status` = 2 AND `valid` = 'limited' AND (`valid_from` > CURDATE() OR `valid_till` < CURDATE() ) ) THEN 1
ELSE `status`
END as `status`,
FROM `table`
WHERE `status` = 2
ORDER BY `id` asc
Why does the WHERE condition ignore my CASE?
Edit:
This is what my database looks like.
username | status | valid | valid_from | valid_till
---------------------------------------------------------
Peter | 1 | unlimited | 2017-05-01 | 2020-05-01 |
Mike | 2 | unlimited | 2017-05-01 | 2017-05-31 |
Janet | 1 | limited | 2017-01-01 | 2017-02-01 |
Ari | 2 | limited | 2017-01-01 | 2017-02-01 |
Tina | 1 | limited | 2018-05-01 | 2020-05-01 |
Rick | 2 | limited | 2018-05-01 | 2020-05-01 |
Donald | 1 | limited | 2017-05-01 | 2020-05-01 |
James | 2 | limited | 2017-05-01 | 2020-05-01 |
Is it possible to get a right match with a CASE or do I also need to edit my WHERE condition like this:
SELECT `id`,
`username`,
CASE
WHEN (`status` = 1 AND `valid` = 'limited' AND (`valid_from` > CURDATE() OR `valid_till` < CURDATE() ) ) THEN 2
WHEN (`status` = 2 AND `valid` = 'limited' AND (`valid_from` > CURDATE() OR `valid_till` < CURDATE() ) ) THEN 1
ELSE `status`
END as `status`,
FROM `table`
WHERE ( `status` = 2 AND `valid` = 'unlimited' ) OR
( `status` = 1 AND `valid` = 'limited' AND ( `valid_from` > CURDATE() OR `valid_till` < CURDATE() ) )
ORDER BY `id` asc