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