MySQL — жесткий запрос с Max, Datediff, подзапросом, Distinct/Limit

#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. хахаха, да, я все исправлял после написания первого комментария. Спасибо за терпение