最近在这里和其他地方看到了一系列关于构建聊天应用程序的帖子,我认为这些应用程序是针对期末项目的,并从中获得了灵感,尝试自己构建。
我有一个用户发送的消息表,基本上包含以下字段:
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 行,在 messages_read 表中没有该 chat_id 和 user_id 的对应记录(但是,该 message_id 可能已被其他用户读取)
要点是,当我通过 AJAX 轮询服务器时,结果页面 (PHP) 应该只返回登录用户尚未看到的 JSON 编码消息列表。
有人有任何建议,或者需要我提供更多信息,以便您可以引导我找到正确的解决方案吗?
谢谢!
最佳答案
尝试一下:
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 JOIN
与 mr.user_id IS NULL
将仅选择 messages_to_chats 中在 messages_read 中没有匹配行的行。
关于MySQL - 选择没有添加条件的相关记录的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43722526/