SQL加入两个具有复杂条件的表

时间:2011-06-18 19:16:45

标签: sql sql-server join query-optimization

我正在尝试合并两个表中的数据。以下是结构:

用户

userID (Primary Key),
firstName,
lastName.

示例数据:

[1, John, Smith]
[2, Steve, Lan]
[3, Matt, Smith] 

消息

messageID (Primary Key),
sender_userID,
receiver_userID,
messageBody.

示例数据:

[1, 1, 1, Hello]
[2, 1, 2, Second Message]
[3, 2, 1, ThirdMessage]
[4, 2, 1, FourthMessage]
[5, 3, 3, LastMessage]

现在,我需要显示用户ID及其同事发布/接收的所有消息。

在上面的示例数据中,userID 1是userID 2的同事。因此,如果我查询userID = 1,那么我应该得到消息ID 1,2,3 [自Message.sender_userID IN(1,2)]和4 [自Message.receiver_userID = 1]。不应出现MessageID = 5,因为3不是任何一个的同事。除此之外,它应该为sender_userID打印firstName和lastName, receiver_userID。

具有唯一messageID的结果应为:

Message.messageID, 
Users.userID (Sender), 
Users.firstName (Sender), 
Users.lastName (Sender), 
Users.userID (Receiver), 
Users.firstName (Receiver), 
Users.lastName (Receiver), 
Message.messageBody

我知道查询可以使用JOIN完成,但我是SQL的新手,有些人无法获得所需的输出。

任何帮助都将不胜感激。

由于

2 个答案:

答案 0 :(得分:0)

假设您的意思是“发件人或收件人= 1”,根据您的逻辑定义“同事”。如果在其他地方定义了同事,我们需要更多信息。

SELECT 
   M.messageID,
   USend.firstName AS firstNameFrom,
   USend.lastName AS lastNameFrom,
   URrec.userID,
   URrec.firstName AS firstNameTo,
   URrec.lastName AS lastNameTo,
   M.messageBody
FROM
   Message M
   JOIN
   User URrec ON M.receiver_userID = URrec.userID
   JOIN
   User USend ON M.sender_userID = USend.userID
WHERE
   M.receiver_userID = 1 OR M.sender_userID = 1

答案 1 :(得分:0)

我假设您使用列表定义同事。下面(1,2) - 是一份同事名单。

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 in (1,2) or 
    mes.receiver_userID in (1,2)

[编辑]如果您只需要显示用户1向其同事发送或接收的消息,那么条件是:

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

1 - 感兴趣的用户
(1, 2) - 是同事名单。 (用户1是他自己的同事:))