开发者

mysql if select then insert

I would like to only insert or update a row, if the following SELECT returns a 0 or no rows.

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

Basically, it is a data archiver that only writes changes. That is it only writes data for a given sample_time, if the data is not the same as what was written for the previous sample_time. This SELECT gets the data for a given channel for the previous sample_time and compares it to the data that has come along for the current sample_time. So if this returns 0, that is the data is different, it should go ahead and write it. And开发者_如何学C if no data has been written for this channel yet, then it should return no rows, and the new data should be written. The following is my query for writing the data:

INSERT INTO data (acquire_time, sample_time, channel_id, value, status, connected)
SELECT ?, ?, channels.channel_id, ?, ?, ?
FROM channels
WHERE channel_name = ?
ON DUPLICATE KEY UPDATE acquire_time = ?, value = ?, status = ?, connected = ?

New data for the current sample_time may overwrite previous data for the current sample_time using the ON DUPLICATE KEY UPDATE, just not if it is the same as the data stored for the previous sample_time.

The duplicate key is the combination of the channel_id and sample_time. There is also a unique index on the channel_id and acquire_time.

Thank you for your time.


After your clarifications below, I believe this will do what you want:

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 = ?;
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜