#mysql #sql #subquery #max
#mysql #sql #вложенный запрос #максимальный
Вопрос:
Короче говоря: MySQL — мне нужно привлечь компании, которые были неактивны некоторое время (или 365 дней для примера fiddle).
Как я это проверяю? у каждой компании есть по крайней мере контакт, который связан с событием, и у каждого события есть (много) подсобытий, в этой последней таблице у меня есть последняя дата активности, дни, в течение которых считается, что одна компания бездействует, определяются за пользователя, у меня нет проблем с выполнением этого вычисления
sql.Append("where DATEDIFF(CURDATE(),DATE(lastdate)) &&t; " days.ToStrin&() "
Проблема в том, что при этом проверяются ВСЕ вложенные события, так что проверяется не только последняя дата, но и каждая дата … и это означает плохой результат.
Я думал о том, чтобы с помощью подзапросов получить или максимальную дату подсобытия контакта, или максимальную дату подсобытия события.
Затем с другом мы приближаемся к чему-то подобному, но запрос бесконечен.
select * from subevent se
where DATEDIFF(CURDATE(),DATE(
(select se2.dates from subevent se2
where se2.dates in
(select max(se3.dates)
from subevent se3
where se.idev = se3.idev)
&roup by se2.dates)));
Я застрял и был бы признателен за помощь…
Пробовал группировать по, подзапросу и MAX (очевидно, что max необходим, но не знаю, как и где применить …)
https://www.db-fiddle.com/f/w&SQGn7Z26tHnwm6nAaNSA/8
(По ссылке Fiddle должны быть указаны только companyname2 и companyname4)
Комментарии:
1. Примеры данных и желаемые результаты в вопросе помогли бы проиллюстрировать, что вы пытаетесь сделать.
2. по ссылке Fiddle это данные, или вы имеете в виду что-то другое? извините, я новичок, желаемый результат — только компания, в примере будет вторая и четвертая компании
Ответ №1:
Вы можете использовать агрегирование, чтобы получить дату последнего вложенного события для каждой компании. Затем фильтруйте, используя havin&
предложение:
select c.idcomp
from contact c join
events e
on e.idcont = c.idcont join
subevent se
on se.idev = e.idev
&roup by c.idcomp
havin& max(se.date) < current_date - interval 365 day;
Здесь есть db-fiddle.
Комментарии:
1. Спасибо за ответ, я запускаю его на скрипте, и он возвращает 4 первых запроса компании вместо 2, которые должны вернуться, но я попытаюсь что-нибудь сделать с этим кодом
2. @Synystter . . . Я добавил db-скрипку. Код работает. Ваши таблицы перепутаны, потому что вы объявили даты как целые числа и не имеете надлежащих
date
констант.3. хахаха, да, я все исправлял после написания первого комментария. Спасибо за терпение