私は個人的なメッセージのために次の表を持っています:
id* sender* recipient* del_by_rec del_by_send
-+----------+-------------+-----------+-----------+
2 tom beth 0 1
5 tom josh 0 1
5 tom chris 1 1
7 ashley burt 1 0
8 jenna tom 1 0
8 jenna ashley 0 0
8 jenna jenna 1 0
10 ashley burt 0 0
どこ
idメッセージIDです。senderとrecipientはユーザーログインです、senderメッセージに固有ですidrecipientメッセージには複数存在する可能性がありますiddel_by_rec受信者が受信トレイからメッセージを削除した場合は1であり、del_by_send送信者が送信トレイからメッセージを削除した場合は1です。id---は主キーでありsender、recipientididメッセージを含む別のテーブルの主キーを参照します。
現在のユーザーが削除することを決定したら、メッセージをテーブルから安全に削除できるかどうかを判断する必要があります。
受信者の受信トレイから:
- 送信者がすでに送信トレイからメッセージを削除している場合(
del_by_send= 1); と - このユーザーが受信トレイからこのメッセージをまだ削除していない唯一の受信者である場合(このユーザーの場合は
del_by_rec= 0、del_by_rec他のすべての受信者の場合は= 1)。
または送信者の送信トレイから:
- すべての受信者がこのメッセージを受信ボックスから削除した場合(
del_by_rec=このメッセージのすべての受信者に対して1)。
del_by_recそれ以外の場合、現在のユーザーは、対応するフラグまたはdel_by_sendフラグを1に設定することにより、このメッセージに削除のフラグを立てます。
この基準を効率的に照会する方法はありますか
- 現在のメッセージを表示している現在のユーザー。また
- 現在のユーザーが複数のメッセージを大量に削除しています(この場合、複数行の結果が返されると思います)。
boolean/intが返されるのは素晴らしいことです。
私の愛のために、私はこのクエリを通り抜けることができませんでした(ユーザーがでashleyあり、彼女が受信トレイからメッセージを削除したいと仮定します8):
SELECT (
(SUM(del_by_send) > 0) # sender has deleted (at least 1)
&& ((SUM(del_by_rec) + 1) >= COUNT(id)) # only 1 recipient has not deleted yet
&& ((SELECT del_by_rec FROM msg_meta WHERE recipient = 'ashley' AND id = 8) = 0) # and that recipient is this user
)
FROM msg_meta
WHERE id = 8
GROUP BY id
- これでうまくいくようですが、ちょっとやり過ぎですか?
id高価なを避けるために、これは複数のメッセージに対して失敗しますforeach。WHERE id IN (7,10)受信者を試しましburtたが、サブクエリにうまく組み込むことができませんでした。
ヘルプ。ありがとうございます。