mysql如果选择则插入

mysql如果选择则插入,mysql,Mysql,如果以下SELECT返回0或无行,我只想插入或更新行 SELECT (value = ? AND status = ? AND connected = ?) FROM channels, data WHERE data.channel_id = channels.channel_id AND channels.channel_name = ? AND sample_time < ? ORDER BY sample_time DESC LIMIT 1 当前采样时间的新数据可能会使用ON D

如果以下SELECT返回0或无行,我只想插入或更新行

SELECT (value = ? AND status = ? AND connected = ?)
FROM channels, data
WHERE data.channel_id = channels.channel_id AND channels.channel_name = ? AND sample_time < ?
ORDER BY sample_time DESC
LIMIT 1
当前采样时间的新数据可能会使用ON DUPLICATE KEY UPDATE覆盖当前采样时间的先前数据,但如果它与先前采样时间存储的数据相同,则不会覆盖

复制键是通道id和采样时间的组合。通道id和采集时间上还有一个唯一的索引


感谢您的时间。

在您做出以下澄清后,我相信这将满足您的要求:

INSERT INTO data (acquire_time, sample_time, channel_id, value, status, connected)
SELECT ?, ?, channels.channel_id, ?, ?, ?
FROM channels
WHERE channel_name = ?
AND NOT EXISTS (
    SELECT 1
    FROM (
        SELECT value, status, connected
        FROM channels, data
        WHERE data.channel_id = channels.channel_id AND channels.channel_name = ? 
        AND sample_time < ?
        ORDER BY sample_time DESC 
        LIMIT 1 
    ) a
    WHERE a.value = ? and a.status = ? and a.connected = ? 
) 
ON DUPLICATE KEY UPDATE acquire_time = ?, value = ?, status = ?, connected = ?;

我认为可以使用触发器。@steini似乎不支持基于触发器中止操作:@squawknull:我不确定我是否理解您的示例。第二部分是否仅在第一部分更新行时运行?我只想在第二部分返回1时运行insert。我没有理解你的问题。我以为您指的是返回1的insert/update查询。这是可行的。我将更新我的答案。@squawknull:我不确定第二个选项是否有效。具有AND值=?和状态=?和连接=?在WHERE子句中,如果任何一行满足这些约束,而不仅仅是ORDER BY sample_id DESC中的一行正确,则该子句将返回true?@squawknull:如果我将其从和存在更改为,并且1=?和1=将不起作用,因为它可能返回多行,或者没有行。如果存在任何匹配项,EXISTS子句的计算结果为true,并且通过将条件添加到该条件的where子句,它仅在满足条件时返回行。最后,将orderby添加到EXISTS中的语句将没有效果,事实上甚至可能导致错误。如果返回任何行,并且它们的顺序不相关,则其计算结果为true。
INSERT INTO data (acquire_time, sample_time, channel_id, value, status, connected)
SELECT ?, ?, channels.channel_id, ?, ?, ?
FROM channels
WHERE channel_name = ?
AND NOT EXISTS (
    SELECT 1
    FROM (
        SELECT value, status, connected
        FROM channels, data
        WHERE data.channel_id = channels.channel_id AND channels.channel_name = ? 
        AND sample_time < ?
        ORDER BY sample_time DESC 
        LIMIT 1 
    ) a
    WHERE a.value = ? and a.status = ? and a.connected = ? 
) 
ON DUPLICATE KEY UPDATE acquire_time = ?, value = ?, status = ?, connected = ?;