2017-05-16 17 views
-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 
+0

valid_from 및 valid_till 필드는 어떤 유형입니까? –

+0

@GiacomoPittalis : valid_fgrom 및 valid_till은 날짜 필드입니다. – Deen

+0

SQL 문은 위에서 아래로 실행되지 않습니다. http://stackoverflow.com/questions/24127932/mysql-query-clause-execution-order –

답변

0

당신은 당신의 테이블의 열 status 있습니다. 따라서 WHERE status = 2은 상태 1 인 모든 레코드를 닫습니다. valid = 'limited'이고 날짜 범위가 오늘 적용되지 않는 경우 상태를 수정하려는 것 같습니다. WHERE 절을 으로 수정하여 상태로 적용하려고합니다. 수정 된 상태를 먼저 가져 와서이 작업을 수행하면됩니다.

SELECT * 
FROM 
(
    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_today 
    FROM table 
) corrected 
WHERE status_today = 2 
ORDER BY id asc;