2012-06-24 2 views
1
IF ((SELECT param FROM changes WHERE type = 'uptime' AND website_id = 1 ORDER BY timestamp DESC LIMIT 1) != 'up') 
    INSERT INTO changes (website_id, timestamp, type, param) VALUES (1, NOW(), 'uptime', 'up') 
END IF; 

이 구문이 잘못된 것 같습니다. 이 쿼리를 단일 쿼리로 어떻게 만들 수 있습니까?INSERT IF 조건이 만 족

답변

4

WHERE 조건에 추가하는 대신 IF를 사용하여 쿼리 외부에서 param 레코드를 읽는 이유는 무엇입니까?

INSERT INTO changes (website_id, timestamp, type, param) 
    SELECT 1, NOW(), 'uptime', 'up' 
     FROM changes 
     WHERE type = 'uptime' AND website_id = 1 AND param != 'up' LIMIT 1 
+0

이 실제로 아주 잘 작동합니다 : 당신이 이런 식으로 할 경우 쿼리 데이터가 삽입됩니다 뭔가를 반환하는 경우 쿼리는 아무 것도 삽입되지 않을 것 아무 것도 반환하지 않는 경우 당신은 단지, 전체 쿼리를 삽입 할 수 있습니다. 감사! – HyderA

+0

아시다시피, 실제로 ORDER BY가 필요하지 않습니다. 코드에서 삭제했습니다. – Jcis

+0

더 많은 것을 고려해야합니다 : 마지막 레코드 (param!)가 param! = 'up'인지 IF가 확인하는 것을 보았습니다. 그러나이 코드는 param을 검색 할 것입니다! = 'up' 마지막 하나, 내가 무슨 뜻인지 이해 하겠니? 마지막 레코드 (내림차순) 만 확인해야하는 경우이 코드는 현재와 같이 작동하지 않습니다. – Jcis

0

changes 이벤트를 로깅하기위한 것 같습니다. 의 모든 변형을 감안할 때이를 수행 할 수 없습니다. 그것을 달성하기 위해 STORED PROCEDURE을 사용해 볼 수 있습니다. 당신은 다음과 같이 뭔가를 할 수 있습니다

select param into @last_param from changes where website_id = 1 and type = 'uptime' limit 1; 

지금 @last_param는 up 또는 down 포함됩니다. last_param이 위 또는 아래 일 경우 다음 명령문은 조건부 일 수 있습니다.