【发布时间】:2012-08-09 11:10:56
【问题描述】:
我有下表用于个人消息:
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可以有多个recipient -
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
- 这似乎可以胜任,但是否有点矫枉过正?
- 这对于多个消息
ids 会失败,以避免昂贵的foreach。我为收件人burt尝试了WHERE id IN (7,10),但我无法将它完全用于子查询..
帮助。谢谢大家。。
【问题讨论】:
标签: mysql boolean conditional-statements