mysql - 连接表中不存在记录时 SQL 不显示行
问题描述
我有一个客户表、付款表和调用表
我想返回由大部分客户列表组成的行,最后一次付款的日期和金额以及最后一次通话的日期。
我编写了一个几乎(所以根本不)有效的查询..只要连接表上存在付款和通话,它就可以按预期工作。如果一个或另一个不存在,则查询不会返回一行。
我想要的是无论付款和通话数据如何都返回的客户数据。
SELECT clientlist.ID, clientlist.FirstName, clientlist.LastName, clientlist.`Herd Number`, clientlist.Address1, clientlist.Address2, clientlist.Address3, clientlist.County,
clientlist.postcode, clientlist.Mobile, clientlist.AuditDue AS `Cert Expiry`,p1.dateofpayment,p1.amt ,c1.dateofcall, a1.link,a1.dateOfAudit
FROM agritxtdev.clientlist left join payments p1
on clientlist.ID=p1.clientnum
left join calls c1
on clientlist.id= c1.clientnum left join auditdate a1 on a1.client = clientlist.id
where p1.id = (Select MAX(id) from payments p2 where p1.clientnum=p2.clientnum)
AND c1.id= (Select MAX(id) from calls c2 where c1.clientnum=c2.clientnum)
order by clientlist.ID
我真的很乐意为您提供任何帮助。
我相当确定我的问题在这里,但我迷失了另一种方法
where p1.id = (Select MAX(id) from payments p2 where p1.clientnum=p2.clientnum)
AND c1.id= (Select MAX(id) from calls c2 where c1.clientnum=c2.clientnum)
在此先感谢彼得
解决方案
实际上,问题在于where
条款中的条件。基本上,您需要将它们移动到on
相应连接的子句中。否则条件是强制性的,并过滤掉left join
不匹配的行:
select ...
from agritxtdev.clientlist
left join payments p1
on clientlist.id=p1.clientnum
and p1.id = (select max(id) from payments p2 where p1.clientnum=p2.clientnum)
left join calls c1
on clientlist.id= c1.clientnum
and c1.id= (select max(id) from calls c2 where c1.clientnum=c2.clientnum)
left join auditdate a1
on a1.client = clientlist.id
order by clientlist.id
推荐阅读
- swift - 如何在swift ui中使用autoid将带有字段的新文档添加到firebase集合
- php - PHP中的数字格式(金钱)
- php - 如何在没有 gulp 和 laravel-elixir 的情况下编译 sass [修复]
- r - 创建具有平均丰度的堆叠条形图
- java - 从给定的字符串中获取总和
- sql - 需要澄清 SQL 代码以检索与员工 ID 一起显示的连续月份的销售计数
- jquery - Laravel 6 使用 jquery 翻译成 ajax 响应
- oauth - Oauth 刷新令牌
- python - 将浮点数舍入到最接近的 0.005 倍数并舍入到 3 个十进制数字会产生奇怪的输出
- javascript - 如何:有 2 个单独的按钮来关闭模式弹出?