[英]MySQL If record in subquery AND 1 field not set or NOT in subquery at all
我正在完成一个过程,其中必须同步多台设备上的消息。 如果您在手机上阅读或删除了该消息,则下次您选择拿起平板电脑时,该消息也会在那里标记为已读或已删除。 常见和预期的行为。
在支持多设备之前,一切正常。 现在问题出在第一个子查询中。
流程:如果用户读取了该消息,则通过将其添加到log_table来记录该消息。 如果被用户删除,则log_table中的delete列将更新。 如果该用户未读该消息,则它将根本不在log_table中。
如果在log_table中有该用户的条目和该消息,则查询返回空结果集。 问题出在第一个子查询中。 如果在一个设备上读取了消息,则在log_table中将有一个条目,因此当读取记录时,NOT IN会产生故障,这会阻止我们在另一设备上同步该读取消息。
注意:消息不是一对一,而是一对多。
期望的结果:我需要做的是,如果未读(不在log_table中)或在log_table中且未删除,则包括该消息。 建议?
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.