2017-03-10 52 views
0

我正在处理一个过程,在这个过程中,我必须在多个设备上同步消息。如果您在手机上阅读或删除它,下次您选择拾取平板电脑时,该消息也会标记为已读或已删除。常见和预期的行为。MySQL如果记录在子查询和1字段中未设置或者不在子查询中

在多设备支持之前,一切都很好。现在问题出现在第一个子查询中。

进程:如果消息被用户读取,则通过将其添加到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

我认为这个问题很明显,但也许不是......我问如何在log_table中没有记录存在于该用户或记录存在于该用户的log_table中时如何包含来自a_table的记录,但记录未标记已删除。 – ppetree

回答

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