【问题标题】:select conditionally with conditional joins in mysql在mysql中使用条件连接有条件地选择
【发布时间】:2020-12-15 00:56:07
【问题描述】:

我正在尝试加入两个表,即 people 和 sales,并根据应用于加入表的 where 条件显示结果。

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

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      |
+---------+--------+

【问题讨论】:

    标签: mysql sql left-join sql-null


    【解决方案1】:

    那就是:

    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 表上的条件位于联接的on 一侧而不是where 子句中,因此它避免了过滤掉没有销售的人。

    还要注意表别名的使用,这会缩短查询,coalesce() 会显示 0 而不是 null 来表示“缺失”的金额。

    【讨论】:

      猜你喜欢
      • 2012-10-24
      • 2012-09-11
      • 2014-12-20
      • 2016-03-10
      • 2013-03-16
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多