如何编写MySQL查询按客户ID展示支付及交易明细?
按客户展示全量支付交易明细实现方案
现有数据表结构
tbl_customer(客户表)
id | name 1 | Ahmad 2 | Taha 3 | Amir
tbl_payment(支付类型表)
id | payment 1 | food 2 | drink
tbl_transaction(交易记录表)
id | id_customer | id_payment | date 1 | 1 | 1 | 2022-08-20 2 | 2 | 1 | 2022-08-21 3 | 2 | 2 | 2022-08-21
需求说明
需要按客户ID展示支付交易明细,要求每个客户都显示所有支付类型的记录:有对应交易的显示交易日期,无交易的日期字段显示null,具体预期结果如下:
- Ahmad的预期结果:
id_payment | payment | date 1 | food | 2022-08-20 2 | drink | null
- Taha的预期结果:
id_payment | payment | date 1 | food | 2022-08-21 2 | drink | 2022-08-21
- Amir的预期结果:
id_payment | payment | date 1 | food | null 2 | drink | null
实现SQL语句
SELECT p.id AS id_payment, p.payment, t.date FROM tbl_customer c CROSS JOIN tbl_payment p LEFT JOIN tbl_transaction t ON c.id = t.id_customer AND p.id = t.id_payment -- 如需单独查询某一个客户,可添加WHERE条件,比如查询Ahmad: -- WHERE c.id = 1 ORDER BY c.id, p.id;
逻辑说明
- CROSS JOIN tbl_payment:让每个客户和所有支付类型做笛卡尔积,生成每个客户对应所有支付类型的基础记录,确保不会遗漏任何一种支付类型。
- LEFT JOIN tbl_transaction:基于客户ID和支付类型ID左连接交易表,有匹配交易的会带出日期,没有匹配的日期字段自动显示
null。 - 如需单独查看某一个客户的明细,只需在语句末尾添加
WHERE c.id = [目标客户ID]即可。
内容的提问来源于stack exchange,提问作者Toha Kepriben
相关产品推荐
相关产品推荐

