我有一张表,我可以获得采样值:AeroSamples
id time temperature pressure humidity
我在5分钟时间内对值进行采样。在将新行插入表格之前,我检查最后一行的温度,压力和湿度值是否与当前值相同。如果是这样,我不想添加新行。否则可以添加新记录。
我这样做:
SELECT temperature, pressure, humidity FROM AeroSamples ORDER BY id DESC LIMIT 1
当我得到最后的值时,我将三个字段与当前值进行比较,这是我不喜欢的方式:
if($row["temperature"] !== $curTemp || $row["pressure"] !== $curPres || $row["humidity"] !== $curHumi)
{
$db->prepare("INSERT INTO AeroSamples (temperature, pressure, humidity) VALUES(:t,:p,:h)");
...
}
我该如何只使用这个SQL?
ON DUPLICATE KEY UPDATE ...
会帮助我吗?我不这么认为。因为我不确定它是否一次对多个字段有效。
答案 0 :(得分:4)
以前的值不是相同的,因为时间不同。唉。
您可以使用insert . . . select
语法执行此操作。我们的想法是选择插入的最后一行并使用where
子句来过滤行。当值相同时,过滤器将不返回任何行(因此没有插入):
insert into AeroSamples(temperature, pressure, humidity)
select :t, :p, :h
from (select temperature, pressure, humidity
from AeroSamples
order by id desc
limit 1
) as1
where as1.temperature <> :t or as1.pressure <> :p or as1.humidity <> :h;
答案 1 :(得分:0)
要使用ON DUPLICATE,您需要为表添加唯一索引。
create unique index aerosamples_ux1 on AeroSamples(temperature, pressure, humidity);
你可以在查询中使用ON DUPLICATE KEY UPDATE或ON DUPLICATE KEY IGNORE ...同时请记住,如果你不使用ON DUPLICATE,你的查询会给你一个错误,并且在添加这个后不会添加重复的记录索引。