我是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
以上查询返回如下所示。
图片说明:5和4之间的最后一条消息是fghhgj,并且看不到消息。现在我想获得5到4之间没有看到的消息数量。
我的意思是我想知道seen=0
的位置。
简介:
消息表包含名为seen的列。如果没有看到消息,则其值为0.现在我想知道每次会话都没有看到多少消息。
答案 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的所有邮件,并使用greatest
和least
按参与者对其进行分组。
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
希望你想要这个。如果您还有其他需要请解释。