MySQL如果子查询中的记录AND 1字段未设置或根本不在子查询中

时间:2017-03-10 02:56:39

标签: mysql subquery

我正在完成一个必须在多台设备上同步消息的过程。如果您在手机上阅读或删除它,则下次选择拿起平板电脑时,该消息也会被标记为已读或已删除。共同和预期的行为。

在多设备支持之前,一切都很顺利。现在问题在于第一个子查询。

进程:如果用户读取了该消息,则会通过将其添加到log_table来记录该消息。如果它被用户删除,则log_table中的已删除列会更新。如果该用户的消息是UNREAD,则它根本不在log_table中。

如果该用户和该消息的log_table中有条目,则查询返回空结果集。问题出在第一个子查询中。如果在一个设备上读取消息,则log_table中将有一个条目,因此NOT IN在读取记录时产生故障,这禁止我们在另一个设备上同步该读取消息。

注意:消息不是1对1,而是1对多。

期望的结果: 我需要做的是,如果消息未读(不在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

建议赞赏!

1 个答案:

答案 0 :(得分:0)

解决方案是条件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