查找匹配的行和空白

时间:2018-11-01 20:24:48

标签: mysql join group-by

我有一个用户表和一个电子签名表-我希望能够显示给定文档的签名者和未签名者。

让我们说我们有员工:

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

1 个答案:

答案 0 :(得分: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 = ?