MySQL-具有Max、Datediff、子查询、Distinct/Limit的硬查询

MySQL-具有Max、Datediff、子查询、Distinct/Limit的硬查询,mysql,sql,subquery,max,Mysql,Sql,Subquery,Max,简言之:MySQL——我需要带上一家已经停用了一段时间的公司(对于fiddle示例来说是365天) 我怎么检查这个?每个公司至少有一个联系人,他与一个事件相关,每个事件都有(许多)子事件,在最后一个表中,我有活动的最后日期,认为一个公司处于不活动状态的天数由用户决定,我没有问题进行此计算 sql.Append("where DATEDIFF(CURDATE(),DATE(lastdate)) > " +days.ToString()+ " 问题是,这检查所有

简言之:MySQL——我需要带上一家已经停用了一段时间的公司(对于fiddle示例来说是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是必需的,但不知道如何应用于何处…)


(在Fiddle链接上,应该只带companyname2和companyname4)

您可以使用聚合来获取每个公司的最后一个子事件日期。然后使用
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;
选择c.idcomp
从联系人c连接
事件e
在e.idcont=c.idcont连接上
子事件se
关于se.idev=e.idev
按c.idcomp分组
最大(截止日期)<当前日期-间隔365天;

是db fiddle。

问题中的示例数据和所需结果将有助于说明您正在尝试执行的操作。在fiddle链接上,是该数据,还是您指的是其他内容?对不起,我是新来的,想要的结果只是公司,在这个例子中,答案是第二个和四个公司的银行,我在小提琴上运行它,它会返回四个第一个公司的银行,而不是应该返回的2个银行,但我会试着做些什么code@Synystter . . . 我加了一把db小提琴。代码是有效的。你的表格乱七八糟,因为你将日期声明为整数,并且没有正确的
date
常量。哈哈哈,是的,我在写第一条评论后就把一切都修好了。谢谢你的耐心