来自两个表的双重联接

时间:2020-09-25 23:58:02

标签: mysql sql datetime left-join

我有(简化)了两个表lessoncharge

我想在当前收费(如果有)之后显示所有课程,因为当金额有效时,并且如果将来有新金额,我想按时间和新金额查看。

>

表的结构如下:

-- 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:

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映射数据更有效?

2 个答案:

答案 0 :(得分:1)

我们应该能够使用left join s来做到这一点:

select l.lessonid, l.title, 
    c1.validfrom current_amount_since,
    c1.amount    curent_amount,
    c2.validfrom amendment_date,
    c2.amount    amended_amount
from lesson l
left join charge c1
    on  c1.lessonid = l.lessonid
    and c1.validfrom <= current_date
    and (c1.validto  >= current_date or c1.validto is null)
left join charge c2
    on  c2.lessonid = l.lessonid
    and c2.validfrom > current_date

注意:

  • 第一个or中的left join条件需要用括号括起来(否则,允许 any 行中带有charge的结束日期为空,无论其课程ID或开始日期如何

  • 您可能希望在第二个联接中的开始日期有严格的不等式,以避免给定的计费行在两个联接中都匹配

答案 1 :(得分:1)

我认为你在哪里很近。尝试以下操作:请注意第二行中的多余()。

npm install