嵌套计数在同一个表中的条件

时间:2015-08-18 06:41:51

标签: mysql sql

我是SQL新手。我正在开发一个聊天应用程序来获取Facebook中的聊天对话。我写了以下查询:

select m.toid, m.fmid, m.message, m.seen
from messages m
where ((toid = 5 or fmid = 5))
  and not exists (select 1 from messages m2
                  where greatest (m2.toid, m2.fmid) = reatest(m.toid,m.fmid)
                    and least (m2.toid, m2.fmid) = least(m.toid,m.fmid)
                    and m2.message_id > m.message_id )
order by message_id desc

以上查询返回如下所示。

MySql WorkBench

图片说明:5和4之间的最后一条消息是fghhgj,并且看不到消息。现在我想获得5到4之间没有看到的消息数量。

我的意思是我想知道seen=0的位置。

简介:

消息表包含名为seen的列。如果没有看到消息,则其值为0.现在我想知道每次会话都没有看到多少消息。

2 个答案:

答案 0 :(得分:4)

要计算结果集中seen等于0的行数,请将查询放在派生表中,并将select count(*)where seen = 0

一起使用
select count(*) from (
    select m.toid,m.fmid,m.message,m.seen from messages m 
    where (toid = 5 or fmid = 5) 
    and not exists (select 1 from messages m2 where 
    greatest(m2.toid,m2.fmid) = greatest(m.toid,m.fmid) and
    least(m2.toid,m2.fmid) = least(m.toid,m.fmid) and m2.message_id > m.message_id )
) t1 where seen = 0

修改

您的更新说明似乎表明您希望每次对话都看到#看不见的消息。如果是,请选择seen等于0的所有邮件,并使用greatestleast按参与者对其进行分组。

select least(toid,fmid), greatest(toid,fmid), count(*)
from messages
where seen = 0
group by least(toid,fmid), greatest(toid,fmid) 

如果您还需要包含没有看不见的消息的对话(即count = 0),请删除where seen = 0条件并将count(*)替换为sum(seen=0),其中seen=0评估为1或0。

select least(toid,fmid), greatest(toid,fmid), sum(seen=0)
from messages
group by least(toid,fmid), greatest(toid,fmid) 

要选择其他列,请将messages加入包含计数的派生表:

select m.*, t1.seen_count from messages m
join (
    select least(toid,fmid) leastid, greatest(toid,fmid) greatestid, sum(seen=0) seen_count
    from messages
    group by least(toid,fmid), greatest(toid,fmid)
) t1 on t1.leastid = least(m.toid,fmid) and t1.greatestid = greatest(m.toid,fmid)

答案 1 :(得分:1)

如果您只想要seen = 0使用的计数:

SELECT COUNT(*) AS TOTAL FROM messages WHERE seen = 0;

在您的查询中

只需在查询中指定表格名称之前添加COUNT(*) AS TOTAL,并在WHERE seen = 0子句中指定where。 它将使用seen = 0返回所有记录,但会添加一列TOTAL 希望你想要这个。如果您还有其他需要请解释。