2012-06-24 149 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; 

這似乎是一個不正確的語法。我還可以在單​​個查詢中完成這項工作嗎?插件如果條件滿足

回答

4

你爲什麼要讀PARAM記錄查詢外使用IF,而不是隻在WHERE條件添加呢?如果你不喜歡這樣,那麼你可以直接插入完整的查詢,如果查詢返回的東西你的數據將被插入,如果您的查詢返回任何然後什麼都不會被插入:

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

更多的東西,你應該考慮到:我看到你的IF被檢查,如果最後一個記錄(許多)有PARAM =「起來」,但是這個代碼我張貼將搜索參數有關的任何記錄=「向上」,而不僅僅是!最後一個,你明白我的意思嗎?如果您確實需要僅對最後一條記錄進行檢查(按降序排列),那麼此代碼將無法正常工作。 – Jcis

0

changes似乎是記錄事件的表。鑑於INSERT的所有變體,這是不可能的。您可以嘗試使用STORED PROCEDURE來實現它。你可以這樣做以下:

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

現在@last_param將包含updown。在下一個聲明中可以有條件地判斷是否last_param處於啓動或關閉狀態。