2017-03-10 5 views
0

私は複数のデバイスでメッセージを同期する必要があるプロセスを進めています。携帯電話でそれを読んだり、削除したりすると、次回にタブレットをピックアップしたときに、メッセージがそこに読まれたり削除されたりするようにマークされます。共通の期待行動。MySQLサブクエリにレコードがあり、フィールドが1つも設定されていないかサブクエリにない場合

複数のデバイスをサポートする前に、すべてがうまくいった。問題は最初のサブクエリにあります。

プロセス:メッセージがユーザーによって読み取られた場合、メッセージはlog_tableに追加されてログに記録されます。ユーザーによって削除されると、log_tableの削除された列が更新されます。そのユーザーがメッセージをUNREADにした場合、メッセージはまったくlog_tableには入りません。

log_tableにそのユーザーとそのメッセージのエントリがある場合、クエリは空の結果セットを返します。問題は最初のサブクエリにあります。 1つのデバイスでメッセージが読み取られた場合、log_tableにエントリが存在するため、レコードが読み取られたときにINはエラーを生成しないので、他のデバイスでその読み取りメッセージを同期させることはできません。

注:メッセージは1対1ではなく1対多です。

望ましい結果:それは未読だ場合 は私が行うために必要なもの、メッセージなどがあり、それはlog_tableでいた場合、または、削除NOT(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にレコードが存在するのにレコードがマークされていない場合削除された – 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 
関連する問題