我有下表用于个人消息:
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
是唯一的- 一条消息
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
,但我无法完全将其放入子查询中。
帮助。谢谢大家..
最佳答案
我的建议是使用子查询在消息级别获取所需的信息,然后对此应用逻辑。以下查询很接近:
select id, (case when sum_del_by_send > 0 and (num_rec - sum_del_by_rec) <= 1
then 'Y'
else 'N'
end) as IsSafeToDelete
from (select id,
sum(del_by_send) as sum_del_by_send,
sum(del_by_rec) as sum_del_by_rec,
count(*) as num_rec
from msg_meta
group by id
) m
这不会考虑当前收件人。这个变体的作用是:
select id, (case when sum_del_by_send > 0 and (num_others - sum_del_by_others) = 1
then 'Y'
else 'N'
end) as IsSafeToDelete
from (select id,
sum(del_by_send) as sum_del_by_send,
sum(case when recipient <> @RECIPIENT then del_by_rec end) as sum_del_by_others,
sum(case when recipient <> @RECIPIENT then 1 else 0 end) as num_others,
count(*) as num_rec
from msg_meta
group by id
) m
这会同时处理所有消息。要处理特定的消息 id,只需将子查询中的“group by id”替换为:
where id = @ID
(@RECIPIENT 和 @ID 是您要为其自定义查询的值。)
关于mysql - 如何从MySQL表中查询复杂的 boolean 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11882115/