我想在对话中检索发件人和目的地的邮件和未读邮件数(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,仅返回第一条消息 谢谢!
答案 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放在消息周围。这对我来说更有意义吗?!