早上好!
我开发了一个允许人们交换消息的Web应用程序。
我在Windows 2012 Server上使用SQL Server 2008和Classic ASP。
为简化起见,假设只有两个表:
tUsers
Id INT IDENTITY(1,1)
Username VARCHAR(20)
tMessages
Id INT IDENTITY(1,1)
UserIdFrom INT
UserIdTo INT
SentDate DATETIME
Message VARCHAR(300)
Read TINYINT
我的问题很简单,但我找不到特定于MS SQL的解决方案。
我需要编写一个查询,返回我和我聊过的其他用户之间的对话列表。
列表必须包含 UserId 和用户名(不是我的,而是我与之交谈过的用户),并且必须按发送日期/时间顺序的顺序排列,并且必须包括消息(来自或来自我)没有回答(例如Whatsapp)。
我找到了很多解决方案,但是对于MySQL来说,转换到MS SQL是行不通的。这是我第一次需要SQL帮助,但我自己找不到解决方案。
有人能给我一个T-SQL查询的例子来解决我的问题???
对不起我的英语,我以前会说意大利语。
这是我在StackOverflow上的第二个问题。我希望我尊重规则。
提前致谢。
答案 0 :(得分:0)
SELECT t2.Id,
t2.Username,
m.SentDate,
m.Message
FROM tMessages m
INNER JOIN tUsers t1
ON m.UserIdFrom = t1.Id
INNER JOIN tUsers t2
ON m.UserIdTo = t2.Id
WHERE (t1.Username = 'danylele' AND t2.Username = 'yourFriend') OR
(t1.Username = 'yourFriend' AND t2.Username = 'danylele')
ORDER BY m.SentDate DESC
如果您想要用户ID而不是用户名,则可以使用此WHERE
子句:
WHERE (t1.Id = 'yourId' AND t2.Id = 'friendId') OR
(t1.Id = 'friendId' AND t2.Username = 'yourId')
答案 1 :(得分:0)
使用H / T到@Tim你可以接受他的查询,并将其与相反的联合起来,以便从另一个人那里获取消息到和:
如果您希望检索所有*对话的列表,可以使用
等查询DECLARE @myUserId INT = 1
SELECT DISTINCT Id, Username
FROM
(
SELECT t2.Id,
t2.Username,
m.SentDate,
m.Message
FROM tMessages m
INNER JOIN tUsers t1
ON m.UserIdFrom = t1.Id
INNER JOIN tUsers t2
ON m.UserIdTo = t2.Id
WHERE t1.Id = @myUserId
UNION
SELECT t2.Id,
t2.Username,
m.SentDate,
m.Message
FROM tMessages m
INNER JOIN tUsers t1
ON m.UserIdFrom = t1.Id
INNER JOIN tUsers t2
ON m.UserIdTo = t2.Id
WHERE t2.Id = @myUserId
)
ORDER BY SentDate DESC
如果您希望特定对话中的所有消息都使用:
DECLARE @myUserId INT = 1
DECLARE @friendUserId INT = 2
SELECT * FROM
(
SELECT t2.Id,
t2.Username,
m.SentDate,
m.Message
FROM tMessages m
INNER JOIN tUsers t1
ON m.UserIdFrom = t1.Id
INNER JOIN tUsers t2
ON m.UserIdTo = t2.Id
WHERE t1.Id = @myUserId AND t2.Id = @friendUserId
UNION
SELECT t2.Id,
t2.Username,
m.SentDate,
m.Message
FROM tMessages m
INNER JOIN tUsers t1
ON m.UserIdFrom = t1.Id
INNER JOIN tUsers t2
ON m.UserIdTo = t2.Id
WHERE t1.Id = @friendUserId AND t2.Id = @myUserId
)
ORDER BY SentDate DESC