选择几列数据

时间:2019-07-10 22:30:01

标签: sql sql-server tsql

我正在编写一个简单的聊天应用程序。想象一下,当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 个答案:

答案 0 :(得分:2)

您必须将表Users两次连接到其他2个表中(以使他成为发送者和接收者):

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