我正在编写一个简单的聊天应用程序。想象一下,当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'
使用此查询,我没有得到正确的结果。我知道这是一个未完成的查询。 但是不知道我该如何继续这个查询。
我该怎么办?
答案 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