У меня есть такая таблица:
id device createdAt type
1 700 2018-09-06 10:00:00 atos
2 700 2018-09-06 09:30:00 farkos
Идея состоит в том, чтобы проверить, есть ли у меня в этой таблице за последние x часов только данные type = atos.
В этом случае я хочу получить false. Если в этой таблице будет только type = atos за последние h часов, ожидаемый результат должен быть верным.
Я пробовал вот так, и после этого проверьте с помощью php, но не очень хорошая идея (я хочу сделать это только в sql) без дополнительной обработки:
SELECT * FROM table t
WHERE t.device = 700
AND t.createdAt >= '2018-09-05 11:00:00'






Случай использования, когда:
SELECT deviceid,case when min(case when type='atos' then 1 else 0 end)=0 then false when min(case when type='atos' then 1 else 0 end)=1 then true end as val FROM table
t
WHERE t.device = 700
AND t.createdAt >= '2018-09-05 11:00:00'
группа по идентификатору устройства
Это не сработает, если с '2018-09-05 11:00:00' введено более одной записи.
Но в моем случае я могу иметь многократный въезд за этот период.
@ Джордж изменил ответ
По-прежнему не работает, если есть atos и farkos
Да, я согласен с @Nick
Итак, если у вас две записи с atos и farkos с одним идентификатором, то каков ваш ожидаемый результат?
Так что если: 1. один атос и один фаркос -----> только ложь 2. только атос --------------------------> только true 3. no atos -----------------------------> только false
Этот запрос сделает то, что вы хотите. Он просматривает все записи в указанное время и, если какая-либо из них не является atos, вернет 0 (ложь). В противном случае он вернет 1 (истина).
SELECT MIN(CASE WHEN t.type != 'atos' THEN 0 ELSE 1 END)
FROM table1 t
WHERE t.device = 700 AND t.createdAt >= '2018-09-05 11:00:00'
Если вы хотите проверить последние h часов, измените предложение WHERE на
WHERE t.device = 700 AND t.createdAt >= NOW() - INTERVAL h HOUR
Не очень хорошо работает. Если у меня 2
type = atos, я получаю 2 разаval 1