如果在COUNT(*)查询中找不到记录,则返回0在MYSQL中

时间:2014-09-30 07:59:24

标签: mysql

我想得到' 0'在执行sql查询时未找到任何记录。我尝试了很多像 ifnull(count(*),0)这样的东西,但没有给出我想要的结果。

查询如下:

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

它给我的结果如下:

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

它不会返回任何' null'或者' 0' 0 ,所以我想得到' 0'或者' null'如果没有找到记录。

6 个答案:

答案 0 :(得分: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

答案 1 :(得分: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的表我想包含数据库中的所有聊天记录,而不包含消息和发件人。

相反,如果您有一个名为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

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分:-2)

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

检查thisthis

答案 5 :(得分:-2)

您可以将sql放在子查询中,这将始终返回一行

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

如果没有记录,则返回0;如果有记录,则返回1.