私は個人的なメッセージのために次の表を持っています:
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
メッセージに固有ですid
recipient
メッセージには複数存在する可能性がありますid
del_by_rec
受信者が受信トレイからメッセージを削除した場合は1であり、del_by_send
送信者が送信トレイからメッセージを削除した場合は1です。id
---は主キーでありsender
、recipient
id
id
メッセージを含む別のテーブルの主キーを参照します。
現在のユーザーが削除することを決定したら、メッセージをテーブルから安全に削除できるかどうかを判断する必要があります。
受信者の受信トレイから:
- 送信者がすでに送信トレイからメッセージを削除している場合(
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
たが、サブクエリにうまく組み込むことができませんでした。
ヘルプ。ありがとうございます。