即使联接表具有空记录,PostgreSQL选择计数

时间:2019-03-05 06:07:29

标签: sql postgresql

我有一个如下的用户表

table.users

{id:1, name:'USER 1'}
{id:2, name:'USER 2'}
{id:3, name:'USER 3'}
{id:4, name:'USER 4'}

USER 1向所有用户发送消息,并且在table.messages中插入了聊天窗口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

1 个答案:

答案 0 :(得分:1)

否定了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

提琴:http://sqlfiddle.com/#!17/c0b0f/2