我有一个如下的用户表
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
答案 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
。