【问题标题】:SQL complex conditionSQL 复杂条件
【发布时间】:2011-06-19 11:15:00
【问题描述】:

我有以下表结构:

用户

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

【问题讨论】:

    标签: sql join


    【解决方案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

    【讨论】:

      【解决方案2】:

      您的两个条件如下所示:

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

      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
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      相关资源
      最近更新 更多