MySQL - 选择没有添加标准的相关记录的记录

时间:2017-05-01 16:22:12

标签: mysql

最近在这里和其他地方发现了一些关于构建聊天应用程序的帖子,我认为这是一个决赛项目,并从中获取灵感,尝试自己构建。

我已经获得了用户基本上发送的消息表:

message_id
chat_id
user_id
message

用户读取的消息表,其中包含以下字段:

message_id
chat_id
user_id
date_seen

我正在尝试构建一个查询来提取特定用户未查看的给定聊天的所有消息。在我尝试指定用户之前,我没有遇到过看不见的邮件的问题,但这个问题让我很难过。

这没有给我任何结果:

SELECT DISTINCT mc.*
FROM messages_to_chats mc
LEFT JOIN messages_read mr 
ON mc.chat_id = mr.chat_id
WHERE mr.chat_uuid = "1" AND mr.user_id = '1' AND mr.date_seen is null

这给了我所有人都没有读过的消息:

SELECT mc.*
FROM messages_to_chats mc
LEFT JOIN messages_read mr
ON mc.message_id = mr.message_id
WHERE mc.chat_id = "1" AND mr.user_id is null

这为我提供了user_id 1已读取的所有消息:

SELECT mc.*
FROM messages_to_chats mc
LEFT JOIN messages_read mr
ON mc.message_id = mr.message_id
WHERE mc.chat_id = "1" AND mr.user_id = '1'

当我在WHERE子句中将=更改为!=时,它根本没有给我任何记录,而只是来自mc表中不记录的记录在mr表中有相应的记录。

本质上,messages_to_chats表中有4行,对于chat_id和user_id(该message_id可能已被其他用户读取),messages_read表中没有相应的记录。 p>

点是当我通过AJAX轮询服务器时,结果页面(PHP)应该只返回登录用户尚未看到的JSON编码消息列表。

任何人都有任何建议,或者需要我提供更多信息,以便引导我找到正确的解决方案?

谢谢!

1 个答案:

答案 0 :(得分:0)

尝试一下:

SELECT mc.*
FROM messages_to_chats mc
LEFT JOIN messages_read mr
ON mc.message_id = mr.message_id
WHERE mr.user_id IS NULL and mc.user_id = 1

LEFT JOINmr.user_id IS NULL将只选择messages_to_chats中messages_read中没有匹配行的行。