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 条件的表(使用 USING
或 ON
并不重要)。 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) |
与 GROUP BY cm.customer_id
和 COUNT(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 |
它返回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 BY
和 COUNT
:
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 |
关于mysql - 在mysql中它不显示计数值0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37359571/