Mysql 从两个表进行双连接
我简化了两张桌子,课表和收费表 我想在当前收费后显示所有课程,如果有,自何时起,金额有效,如果将来有新金额,我想通过时间和新金额查看 表的结构如下所示:Mysql 从两个表进行双连接,mysql,sql,datetime,left-join,Mysql,Sql,Datetime,Left Join,我简化了两张桌子,课表和收费表 我想在当前收费后显示所有课程,如果有,自何时起,金额有效,如果将来有新金额,我想通过时间和新金额查看 表的结构如下所示: -- LESSON: lessonId title description 1 german german course 2 italian italian course 3 english english course -- CHARGE: chargeId l
-- LESSON:
lessonId title description
1 german german course
2 italian italian course
3 english english course
-- CHARGE:
chargeId lessonId validFrom validTo amount
1 1 2020/09/09 2020/10/10 55
1 1 2020/10/11 60
3 3 2019/01/01 75
期望输出:
lessonId title currentAmountSince currentAmount amendmentDate amendedAmount
1 german 2020/09/09 55 2020/10/11 60
2 italian
3 english 2019/01/01 75
到目前为止,我尝试的是,每一行的数量都相同,并且lessonId 1重复:
SELECT l.lessonId, l.title, c.validFrom, c.amount, cF.validFrom, cF.amount FROM Lesson l
LEFT JOIN charge c on l.lessonId = c.lessonId AND c.`from` <= CURRENT_DATE AND c.`to` >= CURRENT_DATE OR c.`to` IS NULL
LEFT JOIN charge cF on l.lessonId = cF.lessonId AND cF.`from` >= CURRENT_DATE
我如何达到我想要的结果?
或者,加载课程和费用列表并以某种方式用Java映射数据是否更有效?我们应该能够通过左连接实现这一点: 注: 第一个左连接中的或条件需要用括号括起来,否则,它允许任何结束日期为空的费用行,无论其课程id或开始日期如何 您可能希望在第二次联接的开始日期上有一个严格的不等式,以避免在两次联接中都匹配给定的费用行
我想你离这里很近。试试这个:注意第二行的额外内容
SELECT l.lessonId, l.title, c.validFrom, c.amount, cF.validFrom, cF.amount FROM Lesson l
LEFT JOIN charge c on l.lessonId = c.lessonId AND c.`from` <= CURRENT_DATE AND (c.`to` >= CURRENT_DATE OR c.`to` IS NULL)
LEFT JOIN charge cF on l.lessonId = cF.lessonId AND cF.`from` > CURRENT_DATE
这个问题留下了连接。@Andreas:是的,但是连接条件有问题。请看我的编辑。那好多了。@Andreas:嗯,答案的初始版本中的查询已经有了我认为正确的修复方法。我只是在事后对答案进行了解释。或者它是否更有效?…-如果费用表在lessonId上有一个索引,那么此代码应该表现良好。请在代码问题中给出一个-cut&paste&runnable代码,包括作为代码输入的最小代表性示例;期望和实际输出,包括逐字记录错误消息;标签和版本;清晰的说明和解释。尽可能少地给出代码,即显示为OK的代码,并通过显示为not OK的代码进行扩展。调试基础。对于包含DBMS和DDL(包括约束和索引)的SQL,请输入格式化为表的代码。在总体目标上暂停工作,在第一个表达中删去代码,不要给出你的期望,说出你的期望和原因。请在每篇文章中提出一个具体的、不重复的问题。PS重新执行:请研究并总结。对于SQL,它包括优化/性能的基础知识,可立即生成索引、计划、统计信息和可搜索性。学习并应用这些基础知识后,请重新优化。太棒了,效果非常好!非常感谢!!
SELECT l.lessonId, l.title, c.validFrom, c.amount, cF.validFrom, cF.amount FROM Lesson l
LEFT JOIN charge c on l.lessonId = c.lessonId AND c.`from` <= CURRENT_DATE AND (c.`to` >= CURRENT_DATE OR c.`to` IS NULL)
LEFT JOIN charge cF on l.lessonId = cF.lessonId AND cF.`from` > CURRENT_DATE