MySQL-使用添加的条件选择没有相关记录的记录

MySQL-使用添加的条件选择没有相关记录的记录,mysql,Mysql,最近,我在这里和其他地方看到了一系列关于构建聊天应用程序的帖子,我认为这是一个期末项目,并从中获得灵感,尝试自己构建聊天应用程序 我有一个由用户发送的消息表,基本上包含以下字段: message_id chat_id user_id message message_id chat_id user_id date_seen 以及用户读取的消息表,其中包含以下字段: message_id chat_id user_id message message_id chat_id user_id da

最近,我在这里和其他地方看到了一系列关于构建聊天应用程序的帖子,我认为这是一个期末项目,并从中获得灵感,尝试自己构建聊天应用程序

我有一个由用户发送的消息表,基本上包含以下字段:

message_id
chat_id
user_id
message
message_id
chat_id
user_id
date_seen
以及用户读取的消息表,其中包含以下字段:

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
这将为我提供用户_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行,但是,对于该聊天id和该用户id,messages_read表中没有相应的记录。该消息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

“左联接”和“mr.user\u id”为空时,将仅选择消息\u-to\u聊天中没有匹配行的行。\u-read。

为什么要投反对票?如果你要投反对票,至少留下一个关于原因的评论。我不知道你为什么投反对票,这实际上为我解决了问题!我会在几分钟内检查它是否正确,但谢谢你!谢谢你,卢卡斯。很高兴它对你有用。如果你也能将其标记为已接受,我将不胜感激。@Sloan Thrasher我不是投反对票的人,但原因可能是你没有解释为什么你的答案解决了OP的问题。换句话说,教一个人钓鱼。@BA_Webimax:谢谢你提供的信息,这将帮助我进一步完善我的答案。在使用左联接时,如果你需要限制左联接右侧表上的数据,在本例中是左联接B,必须将B的限制条件放在联接本身上,否则左联接本质上被视为内部联接。因此,没有更多的思考和充分阅读你的问题。。。将where to where mc.chat_id='1'和left join to left join messages_read mr ON mc.message_id=mr.message_id和mr.user_id!='1'至于原因:两个原因:NULL不能使用=或!=进行比较还有1'将消除左join中的空值。通过这样做,我实际上能够实现我所希望的:选择message_id、pseudo_user_id、message from messages_to_chats,其中chat_uuid=?而message_id不在SELECT message_id FROM messages_read WHERE pseudo_user_id=?至少我认为它可以工作-我打开了两个用户窗口,他们可以来回聊天。需要创建一个新的聊天室,并确保消息不会出现在错误的位置下。。。