2011-06-19 120 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。 –