【问题标题】:Finding rows which match and blanks查找匹配和空白的行
【发布时间】:2018-11-01 20:24:47
【问题描述】:

我有一个用户表和一个电子签名表 - 我希望能够为给定的文档显示谁已经签名和谁没有。

假设我们有员工:

EID   Name
1     Bob
2     Tom
3     Fred

签名:

EID    Document Signature
1      1        Bob
1      2        Bob
1      3        Bob
2      1        Tom
3      2        Fred

我的问题是我可以让它在文档 4 中正常工作 - 因为没有人签名我可以查看文档在哪里为空

但是,例如,如果我查找文档 2,那么我目前正在让员工错过列表

我想查看文档 2

EID Signature
1   Bob
2 
3   Fred

对于文档 4,我希望看到:

EID Signature
1
2 
3

对于文档 1:

EID Signature
1   Bob
2   Tom
3

我尝试使用的查询是:

SELECT e.eid, s.signature 
from employees e 
left join signatures s on e.eid=s.eid 
where s.document=? or s.document IS NULL group by e.eid

【问题讨论】:

    标签: mysql join group-by


    【解决方案1】:

    有多个问题:

    • 无论何时使用Left Join,右侧表格上的任何Where 条件都应放在On 子句中。否则,它会过滤你的结果集,即使没有匹配的行(失去Left Join 的目的)/
    • 为了比较null 的值,我们使用IS NULL= null 不起作用。在这种情况下,如果我们将条件转移到On 子句,我们也不需要检查null 的值。
    • Group By 用法无效,实际上不需要。使用Group By 时,只有聚合列或Group By 中指定的列才能进入Select。参考:https://stackoverflow.com/a/41887524/2469308

    尝试以下方法:

    SELECT e.eid, s.signature 
    FROM employees e 
    LEFT JOIN signatures s 
      ON e.eid=s.eid AND 
         s.document = ?
    

    【讨论】:

    • is null 位是一个错字 - 现在将查看答案的另一部分,感谢您的回复
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 2021-12-19
    • 2012-10-25
    相关资源
    最近更新 更多