-1
내 데이터베이스에는 영구적이거나 제한된 액세스 권한을 가진 사용자가 있습니다.MySQL - CASE가 SELECT에서 사용되는 경우 WHERE 조건이 무시됩니다.
status: 1 = active
status: 2 = blocked
액세스가 제한되어있는 경우 유효한 날짜 이후입니다. 문제는 WHERE 조건이 CASE를 무시한다는 것입니다.
이 예제에서는 상태 2 (= 차단됨) 인 사용자 만 필요합니다.
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
왜 WHERE 조건이 내 사례를 무시합니까?
편집 :
이 내 데이터베이스 모습입니다.
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 |
이 가능한 경우와 권리 일치를 얻거나 나는 또한 편집해야하는 것입니다 내 WHERE 같은 조건 :
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
valid_from 및 valid_till 필드는 어떤 유형입니까? –
@GiacomoPittalis : valid_fgrom 및 valid_till은 날짜 필드입니다. – Deen
SQL 문은 위에서 아래로 실행되지 않습니다. http://stackoverflow.com/questions/24127932/mysql-query-clause-execution-order –