您需要使用LEFT JOIN。并且任何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`;
内连接(JOIN是INNER JOIN的别名)将从cm
表过滤掉任何行,如果没有从ci
表行已发现匹配联接条件(如果你使用不要紧USING
或ON
)。 LEFT JOIN将从cm
表中返回至少一行,但如果ci
表中没有找到匹配JOIN条件的行,则ci
表中的所有列都将为NULL。
实施例:
cm:
| customer_id |
|-------------|
| 1 |
| 2 |
| 3 |
ci:
| customer_id |
|-------------|
| 1 |
| 1 |
| 2 |
INNER JOIN:
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 |
LEFT JOIN:
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_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 |
fiddle
它返回0
为cm.customer_id = 3
因为COUNT只计算不为空值。
如果您使用COUNT(cm.customer_id)
而不是cm.customer_id = 3
,您将获得1
,因为它不是NULL。现在,如果你有一列的任何条件ci
表(如ci.customer_id < 2
),你把它的WHERE子句中fiddle
,不匹配条件的所有行都会被过滤掉。
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 |
sqlfiddle
@Stone:请参阅SQL小提琴。 – wilx
@wix ...谢谢兄弟...在我的sqlYog它的输出为任何计数> 0但不是计数= 0 .....在你的小提琴如果你改变'%r'为'%a'它是甚至没有显示输出表,但它应该已经给出了0下的表名 – Stone
@Stone:我不明白你在说什么。请详细说明。 – wilx