Запрос MySQL/doctrine для извлечения всех элементов, превышающих дату

У меня есть проект Symfony с двумя объектами, такими как Session 1 <-> n Timeslots (и многие другие объекты).

Моя проблема в том, что я не могу найти запрос, который извлекал бы список сеансов, где ВСЕ временные интервалы больше заданной даты. Можно ли это сделать одним запросом?

Я пробовал с MIN (упрощенная версия, без дополнительного JOIN с другими объектами):

SELECT s.id 
FROM session s
JOIN timeslot t ON t.sessionId = s.id
HAVING MIN(t.timelotDate) > '2019-05-05';

Но я не получаю ни одного элемента с этим запросом.

Я сделал для этого sqlfiddle:
http://www.sqlfiddle.com/#!9/4b485b/5

Я не вижу группу по (и благодаря тупости MySQL запрос работает).

Salman A 02.05.2019 15:01
Освоение архитектуры микросервисов с 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
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
1
44
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

используйте max() и group by

SELECT s.id 
FROM session s
JOIN timeslot t ON t.sessionId = s.id group by s.id
having max(t.timelotDate) > '2019-05-05'

Это приведет к получению большего количества результатов, чем ожидалось: сеанс может иметь много временных интервалов, поэтому с вашим запросом я получу любой сеанс, ПО КРАЙНЕЙ МЕРЕ, с одним временным интервалом > XX. Я хочу получить сеанс с КАЖДЫМ/ВСЕМИ временными интервалами> XX

Overdose 02.05.2019 14:58

каков ваш ожидаемый ответ

Fahmi 02.05.2019 14:59
Ответ принят как подходящий

Вы забыли GROUP BY:

SELECT session.id
FROM session
JOIN timeslot ON timeslot.sessionId = session.id
GROUP BY session.id
HAVING MIN(timeslot.timeslotDate) > '2019-05-05'

Альтернативой может быть:

SELECT *
FROM session
WHERE NOT EXISTS (
    SELECT 1
    FROM timeslot
    WHERE timeslot.sessionId = session.id
    AND timeslot.timeslotDate <= '2019-05-05'
)

Вы правы насчет GROUP BY с предложением HAVING: я получаю результаты, но по какой-то причине я получаю все идентификаторы сеансов, а не только те, которые HAVING MIN (t.timelotDate) > '2019-05-05'... Я попытаюсь сделать sqlfiddle или что-то подобное

Overdose 02.05.2019 15:05

@Передозировка, если у вас есть предложение where, которое фильтрует все прошлые/будущие даты, тогда идея HAVING не сработает, хотя NOT EXISTS можно подключить к существующему предложению where.

Salman A 02.05.2019 15:27

В моем «реальном» запросе у меня больше соединений с некоторыми отношениями «многие ко многим» (одно из которых является обязательным, поскольку на нем также есть фильтр). В этом, я думаю, и состоит суть разницы между вашим ответом, который я принял, и моим более сложным запросом. Но часть, касающаяся заданного вопроса, меня устраивает. Мне просто нужно подумать, как обойти проблему.

Overdose 02.05.2019 16:34

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