我有(简化)了两个表lesson
和charge
。
我想在当前收费(如果有)之后显示所有课程,因为当金额有效时,并且如果将来有新金额,我想按时间和新金额查看。
>表的结构如下:
-- 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映射数据更有效?
答案 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