MySQL如果子查询中的记录和1字段未设置或根本不在子查询中
我正在经历一个必须在多台设备上同步消息的过程。如果您在手机上阅读或删除该信息,下次拿起平板电脑时,该信息也会标记为已阅读或已删除。常见和预期的行为 在支持多设备之前,一切都很顺利。现在问题出现在第一个子查询中 进程:如果消息由用户读取,则通过将其添加到log_表来记录消息。如果用户将其删除,则会更新log_表中已删除的列。如果该用户未读取该消息,它将根本不在log_表中 如果log_表中有该用户和该消息的条目,查询将返回一个空结果集。问题出在第一个子查询中。如果在一台设备上读取消息,则log_表中会有一个条目,因此读取记录时NOT in会产生故障,这禁止我们在另一台设备上同步该读取消息 注意:消息不是1对1,而是1对多 预期结果: 我需要做的是,如果消息未读且不在log_表中,或者消息在log_表中且未被删除,则将其包括在内。建议MySQL如果子查询中的记录和1字段未设置或根本不在子查询中,mysql,subquery,Mysql,Subquery,我正在经历一个必须在多台设备上同步消息的过程。如果您在手机上阅读或删除该信息,下次拿起平板电脑时,该信息也会标记为已阅读或已删除。常见和预期的行为 在支持多设备之前,一切都很顺利。现在问题出现在第一个子查询中 进程:如果消息由用户读取,则通过将其添加到log_表来记录消息。如果用户将其删除,则会更新log_表中已删除的列。如果该用户未读取该消息,它将根本不在log_表中 如果log_表中有该用户和该消息的条目,查询将返回一个空结果集。问题出在第一个子查询中。如果在一台设备上读取消息,则log_表
SELECT A.*, T.name FROM a_table AS A
RIGHT JOIN types_table AS T ON A.msg_type = T.id
WHERE A.id NOT IN (SELECT msg_id AS id FROM log_table WHERE userid='3' AND msg_id = A.id AND UNIX_TIMESTAMP(deleted) = 0)
AND 3 IN (SELECT userid FROM subscriber_table AS S WHERE S.userid='3') AND A.id > 01
感谢您的建议 解决方案是一个条件WHERE子句
SELECT A.*, T.name FROM a_table AS A
RIGHT JOIN types_table AS T ON A.msg_type = T.id
WHERE A.id NOT IN (SELECT msg_id AS id FROM log_table WHERE (userid='3' AND msg_id = A.id AND UNIX_TIMESTAMP(read) < 1) OR (userid='3' AND msg_id = A.id AND UNIX_TIMESTAMP(deleted) < 1) )
AND 3 IN (SELECT userid FROM subscriber_table AS S WHERE S.userid='3') AND A.id > 01
你的问题是什么?样本数据和期望的结果肯定会帮助其他人理解您可能要做的事情。你的问题不管用吗?我认为问题很清楚,但可能不。。。我想问的是,如果某个用户的log_表中没有记录,或者该用户的log_表中有记录,但该记录没有标记为已删除,那么如何包含该用户的log_表中的记录。