统计不使用连接表过滤的匹配行的总数



我有以下结构:

  • 培训类型
    • 包含多个会话
      • 每个会话可以有多个插槽
        • 槽有起始日期。(日期列)

如何计算每个训练类型的所有插槽都晚于今天的会话总数?

这里重要的是,我不能使用WHERE语句,否则它将删除行训练3。

我试过了,但结果是错误的,它计算了会话上连接行的总数。

我也尝试了案例方法,但我不确定该方法是否正确,或者我的min(日期)函数不按预期行为

我没有高级的SQL知识所以我不知道我应该查找哪些术语

一些数据:

  1. TrainingType
<表类>id名称required_age类别tbody><<tr>2BNSSA18体育Nautiques3PSE116Secourisme4PSE216Secourisme5PSC110Secourisme
使用子查询:
select t.id, t.name, t.required_age, t.category, (select count(*) 
from TrainingSessions t1 where t.id = t1.type_id and not exists 
(select 1 from Training_sessions t2 where t2.training_session_id = t1.id and t2.start <= now()))
from TrainingType t 

看到小提琴。

可以像下面这样使用聚合和左连接:

select TT.id, TT.name, TT.required_age, TT.category, count(D.type_id)
from TrainingType TT left join
(
select T1.training_session_id, T2.type_id
from TrainingSessionsSlots T1 join TrainingSessions T2
on T1.training_session_id = T2.id
group by T1.training_session_id, T2.type_id
having min(start) > now()
) D
on TT.id = D.type_id
group by TT.id, TT.name, TT.required_age, TT.category
order by TT.id

having min(start) > now()确保所有的插槽日期都大于现在(在training_session_id, type_id组内)。

count(D.type_id)只计数不为空的值,所以当左连接没有匹配时,D.type_id的值将为空,count(D.type_id)的值将为0。

看演示。

最新更新