2012-06-24 150 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处于启动或关闭状态。