MySQL: не вставляйте новую строку, если определенные строки одинаковы

У меня есть таблица, в которой я получаю значения выборки: AeroSamples

id time temperature pressure humidity 

Я выбираю значения в 5-минутный период. Прежде чем вставлять новую строку в таблицу, я проверяю, соответствуют ли значения температуры, давления и влажности последней строки текущим значениям. Если это так, я не хочу добавлять новую строку. Else Добавлена ​​новая запись.

Я так делаю:

 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 ... ли ON DUPLICATE KEY UPDATE ... помочь мне? Я так не думаю. Потому что я не уверен, что он действителен для нескольких полей за раз.

Предыдущие значения не будут одинаковыми, так как время отличается. Увы.

Вы можете сделать это, используя insert . . . select insert . . . select 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; 

Чтобы использовать ON DUPLICATE, вам нужно будет добавить уникальный индекс в таблицу.

 create unique index aerosamples_ux1 on AeroSamples(temperature, pressure, humidity); 

чем вы можете использовать ON DUPLICATE KEY UPDATE или ON DUPLICATE KEY IGNORE внутри ваших запросов … также имейте в виду, если вы не используете ON DUPLICATE, ваш запрос даст вам ошибку и не добавит повторяющуюся запись после добавления этого индекса.