2014-09-30 346 views
0

如果在执行sql查询时未找到任何记录,我希望得到'0'。我尝试了很多东西,如ifnull(count(*),0),但没有给我我想要的结果。如果在COUNT(*)查询中找不到记录,则返回0在MYSQL中

查询是如下提到:

SELECT chat_room_id,COUNT(*) FROM chat WHERE sender_id=13 GROUP BY chat_room_id 

它给了我如下的结果:

__________________________ 
| chat_room_id | Count(*) | 
-------------------------- 

它不返回任何“空”或“0”,所以我想' 0'OR'null'如果没有找到记录。

+0

不应该查询是SELECT chat_room_id,COUNT(*)FROM聊天WHERE SENDER_ID = 13 GROUP BY chat_room_id – Satya 2014-09-30 08:03:29

+0

即使发件人13你想有一个返回的记录不存在? – 2014-09-30 08:16:30

+0

对不起,我编辑了我的问题,它是chat_room_id而不是sender_id。 – ckpatel 2014-09-30 08:37:54

回答

2

只要因为有一个表Chats与字段sender_id那么即使在表中不存在sender_Id 13,以下情况也会返回一行。

set @sender = 13; 
set @chats = (select count(*) from Chat where sender_id = @sender); 

select @sender AS sender_id, IFNULL(@chats,0) AS Count_chats 
; 

See this working at SQLFiddle

+0

嘿,谢谢它为我工作。 – ckpatel 2014-09-30 09:23:59

+0

很高兴,猜你会为chat_room_id调整它,干杯 – 2014-09-30 09:25:08

0

后,您的编辑改变

试试这个:

SELECT distinct c1.chat_room_id, 
(select count(*) from chat c2 c2.chat_room_id = c1.chat_room_id and c2.sender_id = 13) 
FROM chat c1 

关注:

一台名为聊天我想包含在你的数据库中的所有聊天记录,并没有消息和发件人。

相反,如果你有一个名为CHAT_ROOM所有的聊天记录列表表,以便您的查询就会变成:

SELECT chat_room_id, 
(SELECT COUNT(*) 
FROM chat 
WHERE chat.chat_room_id = chat_room.chat_room_id AND chat.sender_id = 13) 
FROM chat_room 
+0

你没有提到你的第一个查询中的c2是什么。在第二个查询中,它会为所有聊天室返回0。 – ckpatel 2014-09-30 09:08:40

+0

固定,是一个错误。但是你不要告诉我你的正确表结构。 – 2014-09-30 09:25:53

+0

我在我的数据库聊天和chat_room中有两个表。在chat [id,message,sender_id,chat_room_id]中,在chat_room [id,created_at]中。所以我想要聊聊所有聊天室的聊天记录。 – ckpatel 2014-09-30 09:43:39

-2

你可以使用mysql_affected_rows()函数;方法来获取受查询影响的行的详细信息。

检查thisthis

+0

我没有看到关于问题标签的'php' – Sharky 2014-09-30 08:12:48

+0

@Sharky - 这不是PHP,我只需要它的MySQL。如操作所示, – ckpatel 2014-09-30 08:39:28

-2

你可以把SQL在子查询,这将总是返回一行

select sub.id,sub.counter from (select sender_id as id,count(*) as counter from chat where sender_id = 13) sub 

如果没有记录或1,如果有这将返回0。

+0

不能与GROUP BY一起使用。 – Sharky 2014-09-30 08:11:35

+0

您可以将Group By移动到外部选择。 – kodeally 2014-09-30 08:30:29

0

您不能查询不在源表中或计算中不可用的数据。

如果你有一个包含所有可用的聊天室的桌子,你可以使用该表使用LEFT OUTER JOIN

SELECT 
    CR.chat_room_id, 
    COUNT(C.chat_room_id) 
FROM 
    chat_rooms CR 
    LEFT JOIN chat C 
    ON CR.chat_room_id = C.chat_room_id 
     AND C.sender_id = 13 -- Moved from WHERE to keep all non-matching records from CR 
GROUP BY 
    CR.chat_room_id 

一个简单的查询,以获得所需的记录,如果你没有一个特定的表,你可以使用LEFT OUTER JOINsubquery得到结果:

SELECT 
    CR.chat_room_id, 
    COUNT(C.chat_room_id) 
FROM 
    (SELECT DISTINCT chat_room_id FROM chat) CR 
    LEFT JOIN chat C 
    ON CR.chat_room_id = C.chat_room_id 
     AND C.sender_id = 13 -- Moved from WHERE to keep all non-matching records from CR 
GROUP BY 
    CR.chat_room_id 

SQLFiddle demo for the second query

+0

COUNT(*)永远不会为NULL,至少为1.如果你想要0,你需要从左连接表(即COUNT(c.chat_room_id))的列中计数 – Gervs 2014-09-30 09:01:18

+0

@Pred,它总是返回1对于所有chat_room_id。 – ckpatel 2014-09-30 09:02:00

+0

@Gervs你是对的,修复了答案,谢谢 – Pred 2014-09-30 09:05:33

0

您是否在寻找返回所有的情况下,发件人ID不存在chat_room_ids?

像,如果说sender_id 9不存在,你想要返回什么?

如果你想要的东西,像

chat_room_id计数 NO_RECORDS 0

然后下面的查询将工作:

declare @Chat_Room_Id varchar(3), 
 
@Count int 
 

 
select @Chat_Room_Id = cast(chat_room_id as varchar(3)), @Count = count(*) from chat where sender_id=13 group by chat_room_id 
 

 
select coalesce(@Chat_Room_Id, 'NO RECORDS') chat_room_id, coalesce(@Count, 0) count

在情况下,我不明白,你能否进一步澄清?

-hth Sourav

相关问题