Java 显示我收到消息的前十个联系人
我想创建Sql语句,显示我收到消息的前十个联系人及其最新发送的消息和时间。表列为Java 显示我收到消息的前十个联系人,java,mysql,sql,Java,Mysql,Sql,我想创建Sql语句,显示我收到消息的前十个联系人及其最新发送的消息和时间。表列为messageId、messageBody、fromUser、toUser、timeStamp,表名为messages。数据库是Mysql,语言是Java。但我希望这发生在一条sql语句中 您可以使用groupby查找每个联系人的最新消息。然后可以连接回消息表以检索消息正文: SELECT fromUser, timeStamp, messageBody FROM messages ORDER BY timeStam
messageId、messageBody、fromUser、toUser、timeStamp
,表名为messages
。数据库是Mysql,语言是Java。但我希望这发生在一条sql语句中 您可以使用groupby
查找每个联系人的最新消息。然后可以连接回消息表以检索消息正文:
SELECT fromUser, timeStamp, messageBody FROM messages ORDER BY timeStamp LIMIT 10
select LastTen.Contact
, LastTen.LastMessageDate
, msg.messageBody
from (
select fromUser as Contact
, max(timeStamp) as LastMessageDate
from YourTable
where toUser = 'YourName'
group by
fromUser
order by
max(timeStamp) desc
limit 10
) LastTen
join YourTable msg
on msg.fromUser = lastTen.Contact
msg.timeStamp = lastTen.LastMessageDate
我把“显示前十个联系人”理解为前十个提交信息的人
Select M2.fromUser
, LastMessage.messageBody
, LastMessage.timeStamp
From (
Select M1.fromUser
, Min(M1.timeStamp) As FirstMessage
, Max(M1.messageId) As LastMessageId
From messages As M1
Where M1.toUser = 'my username'
Group By M1.fromUser
Order By Min(M1.timeStamp) Asc
Limit 10
) As M2
Join messages As LastMessage
On LastMessage.messageId = M2.LastMessageId
类似的方法可能会奏效:
SELECT fromUser, messageBody, timeStamp
FROM (SELECT DISTINCT fromUser FROM messages ORDER BY timeStamp LIMIT 10) AS m1
LEFT JOIN messages
ON(fromUser)
ORDER BY timeStamp DESC LIMIT 1
这不会为每个用户检索最新发送的消息和时间。如果只保留一个查询,就不那么容易了。看不出为什么需要在此处左键联接。不是只涉及一个表吗?对于10个联系人中的每一个,您希望结果表有一行,但该结果行中的数据通常必须来自原始表的两个不同行(最早发送时间行和最晚发送消息行)。你必须以某种方式加入这些行。如果前10条提交的消息都是由同一个人提交的,会发生什么?很好。我已经修改了我的示例(我希望是为了纠正这一点),大多数DBMS都不喜欢在使用Distinct时使用Order By中不在Select子句中的列。TBH,如果DB允许的话,我真的不确定它会如何解释。你没有错过toUser条款吗?我不知道是谁投票否决了你,但我认为这显然是最容易的一个。我没有投票否决这个,但我明白为什么。它无法检索消息。@Ted Hopp:酷,我自己也没看到。添加Join以检索邮件正文。您好!我试图实现你的代码。但我不太明白你们在用FirstMessage做什么,即使我收到了正确的结果?好的,我把som从最小值改为最大值,以使它更简单intuitive@Woho87-如果你是说LastMessageId意外使用了Min,是的,那是个打字错误。