未读消息总数

时间:2017-03-09 11:01:33

标签: mysql postgresql

我想在对话中检索发件人和目的地的邮件和未读邮件数(0)。

+---------------------------------------------------------------+
|                          messages                             |
+---------------------------------------------------------------+
| message_id | id_sender | id_dest |  subject | message | read  |
+---------------------------------------------------------------+
|       1    |     25    |     50  |    Hi    | message |  0    |
|       2    |     25    |     50  |    Hi2   |message2 |  1    |
|       3    |     25    |     50  |    Hi3   |message3 |  0    |
+---------------------------------------------------------------+

在这种情况下,结果必须是2.我尝试

SELECT *
FROM 
    (SELECT message,sum(read = 0) as nm_messages
    FROM messages 
    WHERE ( id_sender = id1 AND id_dest = id2 ) or
          ( id_dest = id1 AND id_sender = id2 )
    ORDER BY message_id DESC
    LIMIT 10) AS ttbl
ORDER BY message_id ASC

消息部分正常,但

我添加

 sum(read = 0) as nm_messages
如果可能,对于两个mysql postgresql,

仅返回第一条消息 谢谢!

2 个答案:

答案 0 :(得分:-1)

我使用的是PostgreSQL 9.4.11,由Visual C ++ build 1800,64位编译。

如果使用distinct,您可以使用其唯一的ID消除相同的行。在这种情况下,我使用了id_sender。

  

SELECT DISTINCT ON(expression [,...])仅保留给定表达式求值等于的每组行的第一行

更多信息请看这个链接: http://nfc-tools.org/index.php?title=Libnfc#Mac_OS_X

在sql查询下面只返回第一条消息和未读消息数(0):

SELECT distinct on (id_Sender) 
       message,
       count(case when read=0 then 1 end) over() as nm_messages
FROM messages
group by id_Sender,message,message_id
order by id_Sender,message_id

消息| nm_message

消息| 2

答案 1 :(得分:-2)

你应该使用if条件的总和。应该是这样的:

SELECT *
FROM 
    (SELECT GROUP_CONCAT(message),sum(IF(read = 0,1,0)) as nm_messages
    FROM messages 
    WHERE ( id_sender = id1 AND id_dest = id2 ) or
          ( id_dest = id1 AND id_sender = id2 )
    GROUP BY id_sender, id_dest
    LIMIT 10) AS ttbl
ORDER BY message_id ASC

当条件为真(读= 1)时,它将总和1,否则为0。

我刚看到查询中没有分组。我补充说。此外,如果您使用聚合函数,那么仅针对一个字段(读取)而不针对其他字段(消息)执行此操作是没有意义的。所以我把group_concact放在消息周围。这对我来说更有意义吗?!