Mysql SQL-LEFT联接,但我希望COUNT(*)只对联接内部的结果进行计数

Mysql SQL-LEFT联接,但我希望COUNT(*)只对联接内部的结果进行计数,mysql,sql,Mysql,Sql,我想显示每个客户的购买数量。如果他们购买了0,我想显示0 所需输出: ------------------------------------- | customer_name | number_of_purchases | ------------------------------------- | Marg | 0 | | Ben | 1 | | Phil |

我想显示每个客户的购买数量。如果他们购买了0,我想显示0

所需输出:

 -------------------------------------
| customer_name | number_of_purchases |
 -------------------------------------
|    Marg       |          0          |
|    Ben        |          1          |
|    Phil       |          4          |
|    Steve      |          0          |
 -------------------------------------
 -------------------------------------
| customer_name | number_of_purchases |
 -------------------------------------
|    Marg       |          1          |
|    Ben        |          1          |
|    Phil       |          4          |
|    Steve      |          1          |
 -------------------------------------
 -------------------------------------
| customer_name | number_of_purchases |
 -------------------------------------
|    Ben        |          1          |
|    Phil       |          4          |
 -------------------------------------
create table customer(customer_id integer, customer_name varchar(20));

create table purchaser(purchaser_id varchar(20), customer_id integer, description varchar(20));


insert into customer values(1, 'Marg');
insert into customer values(2, 'Ben');
insert into customer values(3, 'Phil');
insert into customer values(4, 'Steve');

insert into purchaser values(1, 2, '500 Reams');
insert into purchaser values(2, 3, '6 toners');
insert into purchaser values(3, 3, '20 Staplers');
insert into purchaser values(4, 3, '20 Staplers');
insert into purchaser values(5, 3, '20 Staplers');

SELECT c.customer_id, c.customer_name, COUNT(p.purchaser_id) AS number_of_purchaes 
FROM customer c
LEFT JOIN purchaser p ON c.customer_id = p.customer_id 
GROUP BY c.customer_id;
客户表格:

 -----------------------------
| customer_id | customer_name |
 -----------------------------
|      1      |      Marg     |
|      2      |      Ben      |
|      3      |      Phil     |
|      4      |      Steve    |
 -----------------------------
 --------------------------------------------------
| purchase_id | customer_id | purchase_description |
 --------------------------------------------------
|      1      |       2     |     500 Reams        |
|      2      |       3     |     6 Toners         |
|      3      |       3     |     20 Staplers      |
|      4      |       3     |     2 Copiers        |
|      5      |       3     |     9 Name Plaques   |
 --------------------------------------------------
采购表格:

 -----------------------------
| customer_id | customer_name |
 -----------------------------
|      1      |      Marg     |
|      2      |      Ben      |
|      3      |      Phil     |
|      4      |      Steve    |
 -----------------------------
 --------------------------------------------------
| purchase_id | customer_id | purchase_description |
 --------------------------------------------------
|      1      |       2     |     500 Reams        |
|      2      |       3     |     6 Toners         |
|      3      |       3     |     20 Staplers      |
|      4      |       3     |     2 Copiers        |
|      5      |       3     |     9 Name Plaques   |
 --------------------------------------------------

我目前的查询如下:

SELECT customer_name, COUNT(*) AS number_of_purchaes 
FROM customer 
LEFT JOIN purchases ON customer.customer_id = purchases.customer_id 
GROUP BY customer.customer_id
但是,由于它是一个
左连接
,因此查询会为没有购买的客户生成行,这使他们成为
计数(*)的一部分。换句话说,购买了0件商品的客户显示为购买了1件商品,如下所示:

左连接输出:

 -------------------------------------
| customer_name | number_of_purchases |
 -------------------------------------
|    Marg       |          0          |
|    Ben        |          1          |
|    Phil       |          4          |
|    Steve      |          0          |
 -------------------------------------
 -------------------------------------
| customer_name | number_of_purchases |
 -------------------------------------
|    Marg       |          1          |
|    Ben        |          1          |
|    Phil       |          4          |
|    Steve      |          1          |
 -------------------------------------
 -------------------------------------
| customer_name | number_of_purchases |
 -------------------------------------
|    Ben        |          1          |
|    Phil       |          4          |
 -------------------------------------
create table customer(customer_id integer, customer_name varchar(20));

create table purchaser(purchaser_id varchar(20), customer_id integer, description varchar(20));


insert into customer values(1, 'Marg');
insert into customer values(2, 'Ben');
insert into customer values(3, 'Phil');
insert into customer values(4, 'Steve');

insert into purchaser values(1, 2, '500 Reams');
insert into purchaser values(2, 3, '6 toners');
insert into purchaser values(3, 3, '20 Staplers');
insert into purchaser values(4, 3, '20 Staplers');
insert into purchaser values(5, 3, '20 Staplers');

SELECT c.customer_id, c.customer_name, COUNT(p.purchaser_id) AS number_of_purchaes 
FROM customer c
LEFT JOIN purchaser p ON c.customer_id = p.customer_id 
GROUP BY c.customer_id;
我还尝试了
内部连接
,但这会导致0次购买的客户根本不显示:

内部联接输出:

 -------------------------------------
| customer_name | number_of_purchases |
 -------------------------------------
|    Marg       |          0          |
|    Ben        |          1          |
|    Phil       |          4          |
|    Steve      |          0          |
 -------------------------------------
 -------------------------------------
| customer_name | number_of_purchases |
 -------------------------------------
|    Marg       |          1          |
|    Ben        |          1          |
|    Phil       |          4          |
|    Steve      |          1          |
 -------------------------------------
 -------------------------------------
| customer_name | number_of_purchases |
 -------------------------------------
|    Ben        |          1          |
|    Phil       |          4          |
 -------------------------------------
create table customer(customer_id integer, customer_name varchar(20));

create table purchaser(purchaser_id varchar(20), customer_id integer, description varchar(20));


insert into customer values(1, 'Marg');
insert into customer values(2, 'Ben');
insert into customer values(3, 'Phil');
insert into customer values(4, 'Steve');

insert into purchaser values(1, 2, '500 Reams');
insert into purchaser values(2, 3, '6 toners');
insert into purchaser values(3, 3, '20 Staplers');
insert into purchaser values(4, 3, '20 Staplers');
insert into purchaser values(5, 3, '20 Staplers');

SELECT c.customer_id, c.customer_name, COUNT(p.purchaser_id) AS number_of_purchaes 
FROM customer c
LEFT JOIN purchaser p ON c.customer_id = p.customer_id 
GROUP BY c.customer_id;
我如何才能实现我的期望输出,其中显示了购买量为0的客户?

而不是
计数(*)
使用
计数(购买id)

COUNT(*)
对行进行计数。要计算匹配项,请从第二个表中进行计数,如下所示:

select customer.customer_name , a.number_of_purchases from (
SELECT customer_id, COUNT(purchases.purchase_id) AS number_of_purchaes 
FROM customer 
LEFT JOIN purchases ON customer.customer_id = purchases.customer_id 
GROUP BY customer.customer_id) as a 
inner join customer on customer.customer_id=a.customer_id;
换句话说,
LEFT JOIN
在没有匹配项时返回一行。该行对于
purchases
表中的所有列都有一个
NULL
值。

您可以这样尝试:

样本数据:

 -------------------------------------
| customer_name | number_of_purchases |
 -------------------------------------
|    Marg       |          0          |
|    Ben        |          1          |
|    Phil       |          4          |
|    Steve      |          0          |
 -------------------------------------
 -------------------------------------
| customer_name | number_of_purchases |
 -------------------------------------
|    Marg       |          1          |
|    Ben        |          1          |
|    Phil       |          4          |
|    Steve      |          1          |
 -------------------------------------
 -------------------------------------
| customer_name | number_of_purchases |
 -------------------------------------
|    Ben        |          1          |
|    Phil       |          4          |
 -------------------------------------
create table customer(customer_id integer, customer_name varchar(20));

create table purchaser(purchaser_id varchar(20), customer_id integer, description varchar(20));


insert into customer values(1, 'Marg');
insert into customer values(2, 'Ben');
insert into customer values(3, 'Phil');
insert into customer values(4, 'Steve');

insert into purchaser values(1, 2, '500 Reams');
insert into purchaser values(2, 3, '6 toners');
insert into purchaser values(3, 3, '20 Staplers');
insert into purchaser values(4, 3, '20 Staplers');
insert into purchaser values(5, 3, '20 Staplers');

SELECT c.customer_id, c.customer_name, COUNT(p.purchaser_id) AS number_of_purchaes 
FROM customer c
LEFT JOIN purchaser p ON c.customer_id = p.customer_id 
GROUP BY c.customer_id;
SQL fiddle:

而不是count(*)使用count(purchases.customer\u id)

COUNT(*)返回组中的项目数。这包括空值和重复项

COUNT(ALL expression)为组中的每一行计算表达式,并返回非空值的数目

CREATE table customer(customer_id integer , customer_name varchar(20));

create table purchases(purchase_id integer , customer_id integer , purchase_description varchar(30));

INSERT INTO customer ( customer_id, customer_name )
VALUES ( 1, 'Marg' )
     , ( 2, 'Ben' )
     , ( 3, 'Phil' )
     , ( 4, 'Steve' );

INSERT INTO purchases ( purchase_id, customer_id, purchase_description )
VALUES ( 1, 2, '500 Reams' )
     , ( 2, 3, '6 toners' )
     , ( 3, 3, '20 Staplers' )
     , ( 4, 3, '2 Copiers' )
     , ( 5, 3, '9 Name Plaques' );


 SELECT  c.customer_name
      , COUNT(p.purchase_id) AS number_of_purchases
FROM    customer c
        LEFT JOIN purchases p
            ON c.customer_id = p.customer_id
GROUP BY c.customer_name

SUM(ISNULL(purchases.customer\u id))作为采购数量
我已经添加了答案。检查是否添加了代码和sql FIDLE。
customer\u name
不属于
分组依据
。除非它不对,否则不会起作用
customer_name
位于
select
列表中,但不属于任何
aggregated函数
groupby
子句的一部分。在MySQL中,您不必按所有列进行分组。你可以根据你想要的任何列进行分组。在
mysql
中可能没有那么严格
Oracle
SQL Server
不允许这样做。5.7+将允许这样做,即使在
set SQL\u mode=ONLY\u FULL\u GROUP\u BY
中,只要客户id是PK或唯一的非空辅助密钥。当group by字段是唯一的时,同一表中的其他行不能是无效的聚合,因为它们只能有一个值。请在group by子句中包含customer_id,以避免假设名称是唯一的。