Выберите данные для пары столбцов - PullRequest
0 голосов
/ 11 июля 2019

Я пишу простое приложение чата. Представьте, что когда Michael нажимаете John, я должен показывать сообщения, которые эти сообщения отправляют на John и получают от John.

Я продолжу к проблеме, сначала посмотрите структуру БД, пожалуйста.

CREATE TABLE Users(
Id INT PRIMARY KEY IDENTITY(1,1),
Email NVARCHAR(50) NOT NULL,
LastEntryTime DATETIME DEFAULT(GETDATE()),
IP NVARCHAR(15) NOT NULL
)


CREATE TABLE MessageContent(
Id INT PRIMARY KEY IDENTITY(1,1),
MessageContent NVARCHAR(MAX) NOT NULL,
Size BIGINT NOT NULL,
)

CREATE TABLE Messages(
Id INT PRIMARY KEY IDENTITY(1,1),
Id_Sender INT FOREIGN KEY REFERENCES Users(Id),
Id_Receiver INT FOREIGN KEY REFERENCES Users(Id),
Id_MessageContent INT FOREIGN KEY REFERENCES MessageContent(Id),
SentAt DATETIME NOT NULL,

CHECK(Id_Sender != Id_Receiver)
)

В этом запросе я беру все сообщения, которые отправляет John. Но я хочу принимать сообщения, которые отправляются на John с Michael и получают с John на Michael.

SELECT MessageContent,Users.Id FROM MessageContent,Messages,Users
where users.Id = Messages.Id_Sender and MessageContent.Id = Messages.Id_MessageContent
and users.Email='mailofJhon.com'   

С этим запросом я не получил правильный результат. Я знаю, что это незаконченный запрос. Но не знаю, как мне продолжить этот запрос.

Что я могу сделать?

1 Ответ

2 голосов
/ 11 июля 2019

Вы должны дважды присоединить таблицу Users (чтобы получить отправителя и получателя) к двум другим таблицам:

SELECT c.MessageContent 
FROM MessageContent c 
INNER JOIN Messages m ON c.Id = m.Id_MessageContent
INNER JOIN Users us ON us.Id = m.Id_Sender
INNER JOIN Users ur ON ur.Id = m.Id_Receiver 
WHERE 
  us.Email IN ('mailofJohn.com', 'mailofMichael.com') 
  AND 
  ur.Email IN ('mailofJohn.com', 'mailofMichael.com') 

Если пользователь может отправить сообщение самому себе, необходимо добавить еще одно условие к предложению WHERE:

AND us.Email <> ur.Email
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...