MySQL左连接查询时如何获取右表无匹配行的空数据?
MySQL左连接查询时如何获取右表无匹配行的空数据?
嗨,我来帮你捋捋这个问题哈~你想要的是列出所有文档,同时展示指定用户(比如personId=1)的签名情况,没签的就显示null对吧?
你之前写的SQL踩了个常见的左连接坑:把Signs.personId = 1这个条件放在了WHERE子句里,这就导致结果不符合预期啦。原因是:左连接后,Doc2虽然能关联到Signs里personId=3的记录,但这条行的Signs.personId是3,既不满足=1也不是null,所以被WHERE条件过滤掉了;而你想要的是不管用户有没有签这个文档,所有文档都要出现在结果里,没签的就显示null。
正确的做法是把用户的匹配条件放到LEFT JOIN的ON子句里,这样在连接阶段就只筛选目标用户的签名记录,不会丢失任何文档行。给你写个示例SQL:
SELECT docs.id AS DocId, Signs.SignedAt FROM docs LEFT JOIN Signs ON docs.id = Signs.docId AND Signs.personId = 1;
咱们来拆解下这个SQL:
- 先取出docs表的所有行(也就是Doc1和Doc2)
- 然后只匹配Signs里同时满足
docId等于当前文档id且personId=1的记录 - 对于Doc1,刚好有符合条件的签名记录,所以返回
2023-01-01 - 对于Doc2,找不到personId=1的签名记录,所以SignedAt字段就显示
null,完全符合你想要的结果
备注:内容来源于stack exchange,提问作者Navid_pdp11
相关产品推荐
相关产品推荐

