Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 显示我收到消息的前十个联系人_Java_Mysql_Sql - Fatal编程技术网

Java 显示我收到消息的前十个联系人

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

我想创建Sql语句,显示我收到消息的前十个联系人及其最新发送的消息和时间。表列为
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,是的,那是个打字错误。