Mysql 同一表中条件的嵌套计数
我是SQL新手。我正在开发一个聊天应用程序,以获得类似Facebook的聊天对话。我编写了以下查询:Mysql 同一表中条件的嵌套计数,mysql,sql,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.toi
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之间看不到的消息数
我的意思是我想得到seed的计数,其中seed=0
简言之:
消息表包含名为seen的列。如果未看到消息,则其值为0。现在我想知道每个对话中没有看到多少条消息。如果您只想知道
seen=0
使用的计数:
SELECT COUNT(*) AS TOTAL FROM messages WHERE seen = 0;
或
在查询中,只需将COUNT(*)添加为TOTAL
,然后在查询中指定表名,并在WHERE
子句中指定WHERE seen=0
。它将返回所有记录,其中
seen=0
,但有一个额外的列TOTAL
希望你想要这个。如果您还需要其他信息,请解释。如果您只想知道
seen=0的计数,请使用:
SELECT COUNT(*) AS TOTAL FROM messages WHERE seen = 0;
或
在查询中,只需将COUNT(*)添加为TOTAL
,然后在查询中指定表名,并在WHERE
子句中指定WHERE seen=0
。
它将返回所有记录,其中seen=0
,但有一个额外的列TOTAL
希望你想要这个。如果您还需要其他信息,请解释。要计算结果集中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
编辑
你最新的解释似乎表明,你希望在每次谈话中都能看到大量看不见的信息。如果是这样,请选择看到的等于0的所有消息,并使用最大值
和最小值
按参与者分组
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)
要选择其他列,请将消息
连接到包含以下计数的派生表:
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)
要计算结果集中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
编辑
你最新的解释似乎表明,你希望在每次谈话中都能看到大量看不见的信息。如果是这样,请选择看到的等于0的所有消息,并使用最大值
和最小值
按参与者分组
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)
要选择其他列,请将消息
连接到包含以下计数的派生表:
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)
将having seen=0
添加到您的query@Jens然后,我将获得仅具有seen=0
的记录。我必须获得count ofseen=0的所有对话,抱歉,我不太清楚您需要什么。是。发布预期输出。这将有助于我们更好地理解您的问题,如果您的问题不清楚,请向您的query@Jens然后,我将获得仅具有seen=0
的记录。我必须获得count ofseen=0的所有对话,抱歉,我不太清楚您需要什么。是。发布预期输出。这将有助于我们更好地理解你的问题。如果你的问题不明确,我明白了。但我必须得到我在问题中提供的查询返回的所有列。谢谢,我知道了。但我必须得到我在问题中提供的查询返回的所有列。非常感谢。