我已经为个人信息如下表:如何从MySQL表查询复杂的布尔条件
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
有没有办法有效地查询这个标准
- 查看当前消息的当前用户;或
- 当前用户批量删除多个邮件(我想这种情况下多行结果将被返回)。
返回布尔值/整数将会很棒。
对我的爱,我无法摆脱这种查询(假定用户是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
s来说是不合格的,以避免昂贵的foreach
。我试着WHERE id IN (7,10)
收件人burt
,但我无法完成它的子查询。
帮助。谢谢你们..
哇,你是一个传奇!史诗般的感谢! :D我不得不在'group by id'之前添加'where id in(...)',而不是将它替换为超过1条记录。没关系,对吧?再次,哇。 – 2012-08-09 17:20:04
是的,添加一个where子句来选择多个id很好。 – 2012-08-09 18:02:16