2011-06-19 119 views
1

我具有以下表結構:SQL複雜條件

用戶

userID (Primary Key), 
firstName, 
lastName. 

Sample data: 
[1, John, Smith] 
[2, Steve, Lan] 
[3, Matt, Smith] 

消息

messageID (Primary Key), 
sender_userID, 
receiver_userID, 
messageBody, 
message-visibile 

消息分享範圍可以在0(公衆)或1(私人)

Samp le數據:

[messageID=1, sender_userID=1, receiver_userID=1, messageBody=Hello, message-visibile=1] 
[2, 1, 2, Second Message, 0] 
[3, 2, 1, ThirdMessage, 1] 
[4, 2, receiver_userID=1, FourthMessage, 0] 
[5, 3, 3, LastMessage, 0] 

現在,我需要根據message_visible值(0/1)顯示由用戶ID和他的同事發佈/接收的所有消息。 在上面的示例數據中,userID 1是userID 2的同事。因此,如果我使用message_visible = 1查詢userID = 1,那麼我應該只獲取消息ID 1,3。 MessageID = 5不應該出現,因爲3不是任何人的同事。

我曾嘗試下面的查詢,但它沒有返回預期的輸出:

select 
    mes.MessageId, 
    usr1.sender_userID SenderUserId, 
    usr1.firstName SenderFirstName, 
    usr1.lastName SenderLastName, 
    usr2.userID ReceiverUserId, 
    usr2.firstName ReceiverFirstName, 
    usr2.lastName ReceiverLastName, 
    mes.messageBody 
from Message mes 
    join Users usr1 on 
     mes.sender_userID = usr1.userId 
    join Users usr2 on 
     mes.receiver_userID = usr2.userId 
where 
    mes.sender_userID = 1 and mes.receiver_userID in (1,2) or 
    mes.receiver_userID = 1 and mes.sender_userID in (1,2) 
    AND mes.message-visibile = 1 

此外,在另一種情況之下,它不工作

where 
    mes.sender_userID in (1,2) or 
    mes.receiver_userID in (1,2) 

我路過的同事一組ID 。我錯過了什麼嗎?

回答

1

我想,你缺少周圍OR條件括號:

where 
    mes.message-visibile = 1 and 
     (mes.sender_userID = 1 and mes.receiver_userID in (1,2) or 
     mes.receiver_userID = 1 and mes.sender_userID in (1,2)) 

-- or 

where 
    mes.message-visibile = 1 and 
     (mes.sender_userID in (1,2) or 
     mes.receiver_userID in (1,2)) 

如果條件A or B and C它相當於A or (B and C),因爲and具有較高的操作的優先級。我相信你需要(A or B) and C

+0

的作品。再次感謝 – johnk1

-1

你的兩個條件是這樣的:

mes.sender_userID = 1 and mes.receiver_userID in (1,2) 

OR

mes.receiver_userID = 1 and mes.sender_userID in (1,2) 

用下面總是如此:

AND mes.message-visibile = 1 

所以,你想換兩左右括號以上情況。亞歷克斯接近。

select 
    mes.MessageId, 
    usr1.sender_userID SenderUserId, 
    usr1.firstName SenderFirstName, 
    usr1.lastName SenderLastName, 
    usr2.userID ReceiverUserId, 
    usr2.firstName ReceiverFirstName, 
    usr2.lastName ReceiverLastName, 
    mes.messageBody 
from Message mes 
    join Users usr1 on 
     mes.sender_userID = usr1.userId 
    join Users usr2 on 
     mes.receiver_userID = usr2.userId 
where 
    (mes.sender_userID = 1 and mes.receiver_userID in (1,2)) 
    OR 
    (mes.receiver_userID = 1 and mes.sender_userID in (1,2)) 
    AND mes.message-visibile = 1 
+0

-1 - 圍繞「AND」條件的括號不會影響任何內容。看看操作優先順序:http://msdn.microsoft.com/en-us/library/ms190276.aspx。 –