Mysql 同一表中条件的嵌套计数

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

我是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之间看不到的消息数

我的意思是我想得到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 of
seen=0的所有对话,抱歉,我不太清楚您需要什么。是。发布预期输出。这将有助于我们更好地理解您的问题,如果您的问题不清楚,请向您的query@Jens然后,我将获得仅具有
seen=0
的记录。我必须获得count of
seen=0的所有对话,抱歉,我不太清楚您需要什么。是。发布预期输出。这将有助于我们更好地理解你的问题。如果你的问题不明确,我明白了。但我必须得到我在问题中提供的查询返回的所有列。谢谢,我知道了。但我必须得到我在问题中提供的查询返回的所有列。非常感谢。