我有下表用于个人消息:
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
ordel_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
- 这似乎完成了这项工作,但它有点矫枉过正吗?
- 对于多个 message
id
避免昂贵的foreach
. 我尝试WHERE id IN (7,10)
了收件人burt
,但我无法将其完全用于子查询..
帮助。谢谢大家。。