我有以下结构:
- 培训类型
- 包含多个会话
- 每个会话可以有多个插槽
- 槽有起始日期。(日期列)
- 每个会话可以有多个插槽
- 包含多个会话
如何计算每个训练类型的所有插槽都晚于今天的会话总数?
这里重要的是,我不能使用WHERE语句,否则它将删除行训练3。
我试过了,但结果是错误的,它计算了会话上连接行的总数。
我也尝试了案例方法,但我不确定该方法是否正确,或者我的min(日期)函数不按预期行为
我没有高级的SQL知识所以我不知道我应该查找哪些术语
一些数据:
- TrainingType
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。
看演示。