SQL复杂的条件

时间:2011-06-19 02:44:59

标签: sql join

我有以下表结构:

用户

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

message-visibile可以是0(公共)或1(私有)

示例数据:

[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。我错过了什么吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-1)

您的两个条件如下:

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

OR

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

以下ALWAYS为真:

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