【发布时间】:2015-02-13 21:35:29
【问题描述】:
这是我的桌子。
SELECT * FROM [Message]
现在我想要的是,我想要 Id: 101 的用户从任何其他用户发送或接收的唯一最后一条消息的列表。我为它写的查询如下
SELECT
(SELECT TOP 1 [Message_id]
FROM [Message]
WHERE
([Sender_id] = REC.[Sender_id] AND [Receiver_id] = REC.[Receiver_id])
OR
([Sender_id] = REC.[Receiver_id] AND [Receiver_id] = REC.[Sender_id])
ORDER BY 1 DESC) AS [Message Id],
REC.[Sender_id] AS [Sender Id],
REC.[Receiver_id] AS [Receiver Id],
(SELECT TOP 1 [Message]
FROM [Message]
WHERE
([Sender_id] = REC.[Sender_id] AND [Receiver_id] = REC.[Receiver_id])
OR
([Sender_id] = REC.[Receiver_id] AND [Receiver_id] = REC.[Sender_id])
ORDER BY 1 DESC) AS [Message]
FROM
(SELECT DISTINCT [Sender_id], [Receiver_id]
FROM [Message]
WHERE [Sender_id] = '101') REC
我得到以下结果,看起来不错。
我是数据库查询的新手,我的查询似乎非常低效且冗长。谁能建议一个更好的方法来编写这个查询?此外,如果使用 JOINS 可能是编写此查询的更好方法。
注意:请考虑 Message_id 只是一个唯一的数字,而不是一个有序的标识列,在实际场景中可能是任何生成的唯一字母数字代码。
谢谢。
【问题讨论】:
-
您的语法是 SQL Server。为什么这个问题被标记为 SQLite?
-
你为什么用
sqlite标记SQL Server代码? -
SQLite 被标记是因为我更喜欢 SQL Server 或 SQLite 中的建议。
标签: sql sql-server sqlite