我已經爲個人信息如下表:如何從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