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
 
    