mysql - 在mysql中它不显示计数值0

标签 mysql sql

SELECT IF(COUNT(cm.CUSTOMER_ID)>0,COUNT(cm.CUSTOMER_ID),0) COUNT
FROM  customer_master cm
JOIN customer_issue_details ci USING (customer_id)
WHERE ci.ACTUAL_DATE_RETURN < ci.RETURN_DATE
   AND CUSTOMER_NAME LIKE 'r%'
GROUP BY cm.`CUSTOMER_ID`;

当没有找到这样的记录时,它不会显示计数下的 0,而是仅显示别名计数。如何获得计数下的0。我也使用过ifnull,ifisnull,但没有用。 请谁能告诉我为什么这不起作用以及如何得到 0。

最佳答案

您需要使用左连接。以及任何 ci 的每个条件列必须位于 ON 子句中(否则 LEFT JOIN 将转换为 INNER JOIN)。你必须数ci.CUSTOMER_ID不是cm.CUSTOMER_ID .

SELECT cm.CUSTOMER_ID, COUNT(ci.CUSTOMER_ID) COUNT
FROM  customer_master cm
LEFT JOIN customer_issue_details ci
  ON  ci.customer_id = cm.CUSTOMER_ID
  AND ci.ACTUAL_DATE_RETURN < ci.RETURN_DATE
WHERE CUSTOMER_NAME LIKE 'r%'
GROUP BY cm.`CUSTOMER_ID`;

INNER JOIN(JOIN 是 INNER JOIN 的别名)将过滤掉 cm 中的任何行如果 ci 中没有行,则表已找到匹配 JOIN 条件的表(使用 USINGON 并不重要)。 LEFT JOIN 将返回 cm 中的至少一行表,但如果 ci 中没有行已找到与 JOIN 条件匹配的表,所有列均来自 ci表将为 NULL。

示例:

cm:
| customer_id |
|-------------|
|           1 |
|           2 |
|           3 |

ci:

| customer_id | 
|-------------|
|           1 |
|           1 |
|           2 |

内连接:

SELECT cm.customer_id as `cm.customer_id`, ci.customer_id as `ci.customer_id`
FROM cm
JOIN ci 
  ON ci.customer_id = cm.customer_id;

| customer_id | customer_id |
|-------------|-------------|
|           1 |           1 |
|           1 |           1 |
|           2 |           2 |

左连接:

SELECT cm.customer_id, ci.customer_id
FROM cm
LEFT JOIN ci 
  ON ci.customer_id = cm.customer_id;

| customer_id | customer_id |
|-------------|-------------|
|           1 |           1 |
|           1 |           1 |
|           2 |           2 |
|           3 |      (null) |

fiddle

GROUP BY cm.customer_idCOUNT(ci.customer_id)您可以计算每个 cm.customer_id 找到的行数.

SELECT cm.customer_id, COUNT(ci.customer_id)
FROM cm
LEFT JOIN ci 
  ON ci.customer_id = cm.customer_id
GROUP BY cm.customer_id

| customer_id | COUNT(ci.customer_id) |
|-------------|-----------------------|
|           1 |                     2 |
|           2 |                     1 |
|           3 |                     0 |

fiddle

它返回0对于 cm.customer_id = 3因为 COUNT 仅计算 NOT NULL 的值。

如果您使用COUNT(cm.customer_id)相反,你会得到 1对于 cm.customer_id = 3因为它不是 NULL。 fiddle

现在,如果您对 ci 中的列有任何条件表(如 ci.customer_id < 2 )并将其放入 WHERE 子句中,所有不符合该条件的行都将被过滤掉。

SELECT cm.customer_id, ci.customer_id
FROM cm
LEFT JOIN ci 
  ON  ci.customer_id = cm.customer_id
WHERE ci.customer_id < 2

| customer_id | customer_id |
|-------------|-------------|
|           1 |           1 |
|           1 |           1 |

但是将该条件移至 LEFT JOIN ON 子句中,您将为每个 cm.customer_id 至少保留一行,因为这就是 LEFT JOIN 的工作原理。

SELECT cm.customer_id, ci.customer_id
FROM cm
LEFT JOIN ci 
  ON  ci.customer_id = cm.customer_id
  AND ci.customer_id < 2

| customer_id | customer_id |
|-------------|-------------|
|           1 |           1 |
|           1 |           1 |
|           2 |      (null) |
|           3 |      (null) |

现在GROUP BYCOUNT :

SELECT cm.customer_id, COUNT(ci.customer_id)
FROM cm
LEFT JOIN ci 
  ON  ci.customer_id = cm.customer_id
  AND ci.customer_id < 2
GROUP BY cm.customer_id;

| customer_id | COUNT(ci.customer_id) |
|-------------|-----------------------|
|           1 |                     2 |
|           2 |                     0 |
|           3 |                     0 |

sqlfiddle

关于mysql - 在mysql中它不显示计数值0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37359571/

相关文章:

sql - Oracle测量存储过程的执行时间

sql - 在 SELECT * 中仅使用一次连接列

php - 将用户的 id 放入开放类中

mysql - 在一个表中为另一个表中的所有行插入值

php - 同时向数据库输入两个或多个值

MYSQL - 从一个表中查找另一个表中不存在的记录

c# - 将多个字段绑定(bind)到 ASP.NET 中的列表框

javascript - 如何在mysql Node js中创建表?

php - mySQL with php function - 使用php循环输入数据

mysql - 以编程方式重新排序 SQL 列?