select 有条件地与 mysql 中的条件联接

select conditionally with conditional joins in mysql

我正在尝试加入两个 tables,人员和销售人员,并根据应该用于加入 tables 的 where 条件显示结果。

我目前的尝试只显示一个结果,但我希望显示人员中的所有行,无论他们是否有销售记录 table,如果他们有记录并且类型是credit 那么我只想显示金额。

CREATE TABLE people(
   person_id INTEGER  NOT NULL PRIMARY KEY 
  ,name  VARCHAR(6) NOT NULL
);
INSERT INTO people(person_id,name) VALUES (1,'John');
INSERT INTO people(person_id,name) VALUES (2,'Alice');
INSERT INTO people(person_id,name) VALUES (3,'Mary');


CREATE TABLE sales(
   sales_id INTEGER  NOT NULL PRIMARY KEY 
  ,customer_id  VARCHAR(6) NOT NULL
  ,type  VARCHAR(6) NOT NULL
  ,amount  VARCHAR(6) NOT NULL
);

INSERT INTO sales(sales_id,customer_id,type,amount) VALUES (1,1,'credit',100);
INSERT INTO sales(sales_id,customer_id,type,amount) VALUES (2,3,'cash',200);

请使用我当前的代码检查 fiddle example 并帮助我获得如下所示的结果:

+---------+--------+
| name    | amount |
+---------+--------+
| john    | 100    |
| alice   | 0      |
| mary    | 0      |
+---------+--------+

那就是:

select p.name, coalesce(s.amount, 0) as amount
from people p
left join sales s on s.customer_id = p.person_id and s.type = 'credit' 

与原始代码的主要区别在于 left joined table 上的条件位于连接的 on 端,而不是 where条款,因此它避免过滤掉没有销售的人。

另请注意 table 别名的使用,它缩短了查询,coalesce() 显示“缺失”金额的 0 而不是 null