2016-05-21 75 views
0
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下count.I使用ifnull,ifisnull也没用。 请任何一个可以告诉这是为什么不工作,如何获取0在mysql中它没有显示计数值0

回答

0

未经测试,请尝试使用由cm.CUSTOMER_ID而是由ci.CUSTOMER_ID不分组。另外,我认为你需要一个LEFT JOIN

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

下面是SQL小提琴简化无ACTUAL_DATE_RETURN并没有RETURN_DATEhttp://sqlfiddle.com/#!9/73cc64/2/0

更新1

在乌尔拨弄如果u改变 '%R' 到 '%一个' 这不是甚至显示输出表,但它应该已经给出了0表下的名称

这就是SQL的工作原理。由于没有名称与该表达式匹配的客户,因此不会得到任何结果行。您需要检查应用程序中设置的空结果。

+0

@Stone:请参阅SQL小提琴。 – wilx

+0

@wix ...谢谢兄弟...在我的sqlYog它的输出为任何计数> 0但不是计数= 0 .....在你的小提琴如果你改变'%r'为'%a'它是甚至没有显示输出表,但它应该已经给出了0下的表名 – Stone

+0

@Stone:我不明白你在说什么。请详细说明。 – wilx

2

您需要使用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表行已发现匹配联接条件(如果你使用不要紧USINGON)。 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_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

它返回0cm.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 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

+0

Thanx,它的工作.....我正在写USING子句,而不是ON子句that'why o/p没有来... .......请告诉你为什么刚刚在ON子句后写入(AND ci.ACTUAL_DATE_RETURN Stone

+0

@Stone,我希望这个更新能够回答你所有的问题:-) –

+0

thanx帮助 – Stone