MySQL - Жесткий запрос с максимальным, Datediff, Subquery, Distinct / Limit - PullRequest
1 голос
/ 07 августа 2020

Вкратце: MySQL - Мне нужно указать компанию, которая какое-то время бездействовала (или 365 дней для примера со скрипкой).

Как это проверить? у каждой компании есть по крайней мере контакт, который связан с событием, и у каждого события есть (много) подсобытий, в этой последней таблице у меня есть последняя дата активности, дни, когда считается, что одна компания находится в неактивности, решаются для пользователь, у меня нет проблем с выполнением этого расчета

sql.Append("where DATEDIFF(CURDATE(),DATE(lastdate)) > " +days.ToString()+ "

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

Я думал о подзапросах, чтобы получить или максимальную дату для вспомогательного события контакта, или максимальную дату вспомогательного события.

Затем мы с другом приблизиться к этому, но запрос бесконечен.

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) 
group by se2.dates)));

Я застрял, и я был бы признателен за помощь ...

Попытка группы по, подзапросу и MAX (очевидно, max необходимо, но не о том, где применять ...)

https://www.db-fiddle.com/f/wgSQGn7Z26tHnwm6nAaNSA/8

(На ссылке Fiddle должны быть указаны только имя компании2 и имя компании4 )

1 Ответ

2 голосов
/ 07 августа 2020

Вы можете использовать агрегирование, чтобы получить дату последнего вспомогательного события для каждой компании. Затем отфильтруйте, используя предложение having:

select c.idcomp
from contact c join
     events e
     on e.idcont = c.idcont join
     subevent se
     on se.idev = e.idev
group by c.idcomp
having max(se.date) < current_date - interval 365 day;

Здесь - это db-fiddle.

...