繁体   English   中英

MySQL如果在子查询AND 1字段中未设置记录,或者在子查询中根本没有记录

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM