即使MySQL中不存在记录,也显示每个项目的条目

时间:2018-10-10 05:15:35

标签: mysql

我有两个桌子。第一个表是一个批次列表-表名public class MyCustomTab : TabControl { public MyCustomTabPageCollection TabPages { get; set; } public MyCustomTab() : base() { base.Width = 200; base.Height = 100; } } 。一共有3个批次,由三个人管理,这些字段是:lot.lotID,lot.LotName

每天,这些批次都会收集卵,但是有时收集人员会忘记在一天结束时进入。这些条目进入名为httpHeaders: - name: Authorization value: Basic cnBjOnUzSGRlM0xvaWI1SGpEcTFTZGVoQktpU1NBbHE= - name: Accept value: application/json 的表中。该表具有deposit.DepID,deposit.DepDate,deposit.LotID和deposit.DepAmount

我需要每天列出每个批次并获取每个存款金额。如果没有任何记录,则应显示该记录是NULL值或0,而不是不显示记录。例如,如果在2018-10-11的批次2的数据库中未插入任何条目,则应该看到此记录如果我查询两天的数据:

lot

或者,如果10-10的批次2说:

deposit

有人可以给我一些指导吗?看起来这简直太疯狂了,但是在这个问题上我找不到太多。在此先感谢!

PS-以下是两个表: 很多:

LotID | LotName | Date | DepAmount
1 | Sarah | 2018-10-09 | 67
2 | Dave | 2018-10-09 | 84
3 | Mike | 2018-10-09 | 78
1 | Sarah | 2018-10-10 | 100
2 | Dave | 2018-10-10 | 0
3 | Mike | 2018-10-10 | 49

并存入:

2 | Dave | 2018-10-10 | {null}

1 个答案:

答案 0 :(得分:1)

这是一个棘手的问题,因为直人LEFT JOIN不能正常工作,因为某个人具有除deposit中没有值的日期以外的其他日期的值。因此,我们需要首先CROSS JOIN lot并列出deposit中所有日期的列表,以获得一组所有人和所有日期,即

SELECT l.LotId, l.LotName, dt.Date
FROM lot l
CROSS JOIN (SELECT DISTINCT DepDate AS Date
            FROM deposit) dt

输出:

LotId   LotName     Date    
1       Sarah       2018-10-09
2       Dave        2018-10-09
3       Mike        2018-10-09
1       Sarah       2018-10-10
2       Dave        2018-10-10
3       Mike        2018-10-10

然后,我们可以使用LEFT JOINdeposit将此结果NULL转换为0:SELECT l.LotId, l.LotName, dt.Date, COALESCE(d.DepAmount, 0) AS DepAmount FROM lot l CROSS JOIN (SELECT DISTINCT DepDate AS Date FROM deposit) dt LEFT JOIN deposit d ON d.LotId = l.lotId AND d.DepDate = dt.Date ORDER BY Date, l.LotId ,以获取每天的存款清单。

LotId   LotName     Date        DepAmount
1       Sarah       2018-10-09  67
2       Dave        2018-10-09  84
3       Mike        2018-10-09  78
1       Sarah       2018-10-10  100
2       Dave        2018-10-10  0
3       Mike        2018-10-10  49

输出:

classes*.dex