sql - 即使连接表有空记录,Postgresql 也会选择计数
问题描述
我有一个用户表如下
表用户
{id:1, name:'USER 1'}
{id:2, name:'USER 2'}
{id:3, name:'USER 3'}
{id:4, name:'USER 4'}
USER 1 向所有用户发送消息,聊天窗口 id 插入 table.messages
表消息
{id:1,chat_id:1, from_user:1: message:'Hi'}
{id:2,chat_id:1, from_user:1: message:'How are you'}
{id:3,chat_id:1, from_user:1: message:'This is broadcasted'}
table.last_read
{id:1, last_read_message_id:3, user_id:2, chat_id:1}
{id:2, last_read_message_id:3, user_id:3, chat_id:1}
我正在使用下面的查询来获取用户的未读消息,因为 table.last_read 仅在至少一个读取时插入,USER 4 不会在 table.last_read 中记录,下面在左连接中返回 last_read_message_id null 并返回 0记录
SELECT COUNT(*) FROM messages m
LEFT JOIN (
SELECT last_read_message_id
FROM last_read
WHERE user_id=4
) lr ON m.chat_id=lr.chat_id
WHERE m.chat_id=1 AND m.id>last_read_message_id
解决方案
的使用LEFT JOIN
被否定,因为您在WHERE
子句中引用了该表中的字段。它的行为就像INNER JOIN
一个结果。
要解决此问题,请将标准添加到您的JOIN
规范中。
SELECT COUNT(*)
FROM messages m
LEFT JOIN last_read lr
ON m.chat_id = lr.chat_id
AND m.id > lr.last_read_message_id
AND lr.user_id = 4
WHERE m.chat_id = 1
这相当于你的 last_read_message_id 从 移动WHERE
到JOIN
.
推荐阅读
- c# - 局部函数和 SOLID 原则 C#
- python - Paramiko failing due due to file permissions
- javascript - 如何在不影响输入值的情况下将美元符号添加到输入字段?
- python - 使用 Python argparse 拾取的参数管道到 Docker 标准输入
- cordova - 限制相机插件ionic2 cordova中的文件大小?
- ms-access - 如何在 Access VBA 中引用已保存的查询?
- r - 闪亮时动态变量的电平选择
- ruby - 模块 Process 是否有私有实例方法“等待”?
- android - 如何将媒体播放器搜索到特定的帧位置?
- linux - Sed to split based on quotes handling comma within quotes along with data without comma within multiple quotes