2016-08-19 2 views
1

아래 스크립트를 사용하여 cronjob으로 세션을 정리할 수 있습니다.데이터베이스 항목이 삭제 중임

나는 40 분 이상 작동하지 않을 때 한 세션을 정리할. 하지만 특정 user_id가 있으면 1 일 동안 지속되어야합니다.

이것은 작동하지 않으며 이유를 볼 수 없습니다. 때로는 사용자 ID가 있어도 삭제 될 수 있습니다.

DELETE FROM session 
WHERE 
    CASE 
     WHEN 
      user_id IN (3,4,5,6,7) 
     THEN 
      expiry < DATE_SUB(NOW(), INTERVAL 1 DAY) 
     ELSE 
      expiry < DATE_SUB(NOW(), INTERVAL 40 MINUTE) 
    END 

user_id의 데이터 유형은 int이고, expiry의 데이터 유형 datetime이다.

+0

? 'DELETE FROM session'을'SELECT user_id, expiry FROM session'으로 바꾸십시오. –

+0

에 비교할 값을 반환 할 경우 삭제하는 무엇을 살펴보십시오 대신 DELETE의 SELECT를 실행 봤어 – SQB

답변

0
외부 비교를 이동하고 케이스 내부에 그것을하지

:

DELETE FROM session 
    WHERE expiry < CASE 
    WHEN user_id IN (3,4,5,6,7) THEN DATE_SUB(NOW(), INTERVAL 1 DAY) 
    ELSE DATE_SUB(NOW(), INTERVAL 40 MINUTE) 
    END 
+0

차이점을 알 수 있습니까? 아니면 이것이 해결책이라고 알고 있습니까? :) – Djip

+0

이것은 이것이 비교를 명확하게한다는 것에 동의하지만, 이것은 필요하지 않아야합니다. OP가 작성한 CASE 문은 true 또는 false를 반환하고 WHERE 절은 그에 따라 작동해야합니다. – SQB

0

당신이 CASE를 사용해야합니까? 은 그냥 같이 간단하지 않을까요 :

DELETE FROM session WHERE expiry < DATE_SUB(NOW(), INTERVAL 1 DAY) OR (expiry < DATE_SUB(NOW(), INTERVAL 40 MINUTE) AND user_id NOT IN (3,4,5,6,7))

이 방법은 모든 1 일까지 만료 플러스 사람들은 그 ID의 아무도 없어 40분가 만료 삭제합니다.

는 케이스 외부의 비교를 이동하고 단지