SQL объединяет две таблицы со сложным условием - PullRequest
1 голос
/ 18 июня 2011

Я пытаюсь объединить данные из двух таблиц.Ниже приводится структура:

Пользователи

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]

Теперь мне нужно отобразить все сообщения, отправленные / полученные идентификатором пользователя и его коллегами.

В приведенных выше примере данных идентификатор пользователя 1 равенколлега userID 2. Итак, если я запрашиваю userID = 1, я должен получить ID сообщения 1, 2, 3 [Так как Message.sender_userID IN (1,2)] и 4 [Так как Message.receiver_userID = 1].MessageID = 5 не должен появляться, потому что 3 не является коллегой никого.Наряду с этим, он должен напечатать firstName и lastName для обоих sender_userID, receive_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 голосов
/ 18 июня 2011

Полагаю, вы определяете коллег по списку. Ниже (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 является коллегой самому себе:))

0 голосов
/ 18 июня 2011

Предполагается, что вы имеете в виду «где отправитель или получатель = 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
...