Получить данные sql, если есть определенное значение

У меня есть такая таблица:

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'
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
0
34
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Случай использования, когда:

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'

группа по идентификатору устройства

Не очень хорошо работает. Если у меня 2 type = atos, я получаю 2 раза val 1

klsdskldsd 07.09.2018 11:17

Это не сработает, если с '2018-09-05 11:00:00' введено более одной записи.

Nick 07.09.2018 11:17

Но в моем случае я могу иметь многократный въезд за этот период.

klsdskldsd 07.09.2018 11:18

@ Джордж изменил ответ

Fahmi 07.09.2018 11:18

По-прежнему не работает, если есть atos и farkos

Nick 07.09.2018 11:19

Да, я согласен с @Nick

klsdskldsd 07.09.2018 11:20

Итак, если у вас две записи с atos и farkos с одним идентификатором, то каков ваш ожидаемый результат?

Fahmi 07.09.2018 11:21

Так что если: 1. один атос и один фаркос -----> только ложь 2. только атос --------------------------> только true 3. no atos -----------------------------> только false

klsdskldsd 07.09.2018 11:23
Ответ принят как подходящий

Этот запрос сделает то, что вы хотите. Он просматривает все записи в указанное время и, если какая-либо из них не является 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

Другие вопросы по теме