有3张桌子:
用户:
UID, DeptID, Name, Surname, Admin
U1 DeptA John Doe 0
U2 DeptB Jack Fisher 0
U3 DeptA Jill Smith 0
U4 DeptA Joan Green 1
U5 DeptC Jeff Jones 1
U6 DeptA Amanda Reed 0
......
Depts:
DeptID, DeptName
DeptA Denver
DeptB Boston
DeptC Seattle
消息:
Sender, Receiver, Message, CreatedDate, Seen
U1 U3 Msg1 20152310 0
U1 U4 Msg2 20152310 0
U4 U1 Msg3 20152310 0
U3 U4 Msg4 20152310 0
U1 U3 Msg5 20152310 0
U3 U1 Msg6 20152310 0
(用户只能向同一部门的其他用户发送消息)
仅输入一个参数,即UID
我需要创建一个列表,其中包含相同部门的所有用户(输入UID除外)作为标题,因此在示例中
U3 U4 U6
用他们的详细信息(姓名,姓氏)来创建标签列表
然后对于上面的每个UID,列出最新的20条消息,其中U1既作为发送方又作为接收方
要填写聊天边栏,您可以在此处看到:http://www.keenthemes.com/preview/metronic/theme/admin_4/
点击右上角的图标
我试过这个..但是有很多重复,不知道如何删除:也许交叉申请不是正确的命令......: - (
SELECT u.UID,
u.PWD,
i.Sender,
I.MessageText
.....
FROM (
SELECT S.UID,
S.PWD
FROM dbo.Users u
JOIN dbo.Users u2 ON u.DeptID=u2.DeptID
WHERE u2.UID=@_UID
ORDER BY u.Admin DESC
) AS u
CROSS APPLY
(
SELECT TOP (20)
m.Sender,
m.Message,
m.CreatedDate,
m.Seen
FROM dbo.Messages m
WHERE m.Sender=@_UID
OR m.Receiver=@_UID
ORDER BY m.CreatedDate DESC
) m;
可以提出错误的建议吗?
由于
乔
答案 0 :(得分:1)
老实说,我无法确切地知道您的查询正在尝试做什么。但是,通过查看您链接的页面和问题描述,听起来您希望查询填充用户列表(当前用户除外),而另一个用于获取与该用户相关的消息。
考虑类似的事情:
DECLARE @_UID varchar(2) = 'U3';
-- Query for populating list of users
SELECT [UID], [Name] + ' ' + [Surname] AS [FullName]
FROM [dbo].[Users]
WHERE [UID] <> @_UID
ORDER BY [Admin] DESC, [Surname], [Name];
-- Query for populating messages
SELECT TOP 20 S.[UID] AS [SenderUID], S.[Name] + ' ' + S.[Surname] AS [SenderFullName],
R.[UID] AS [ReceiverUID], R.[Name] + ' ' + R.[Surname] AS [ReceiverFullName],
M.[Message], M.[CreatedDate], M.[Seen]
FROM [dbo].[Messages] M
INNER JOIN [dbo].[Users] S ON S.[UID] = M.[Sender]
INNER JOIN [dbo].[Users] R ON R.[UID] = M.[Receiver]
WHERE @_UID IN(M.[Sender], M.[Receiver])
ORDER BY M.[CreatedDate] DESC;
关于APPLY的用法,它类似于JOIN。使用JOIN时,您将一组已知的结果(例如表的内容)组合到另一组已知的结果中。使用APPLY时,不一定必须知道右侧结果集 - 例如,您可以使用函数根据左侧结果计算结果。