按时间戳对组内的行进行排序

Posted

技术标签:

【中文标题】按时间戳对组内的行进行排序【英文标题】:order rows within group by timestamp 【发布时间】:2013-10-24 23:36:07 【问题描述】:

我正在尝试为私人消息构建和收件箱。

$sqlInbox = "
    SELECT sender, receiver, message, parent, rView
    FROM messages 
    WHERE receiver='$log_username' OR sender='$log_username' 
    GROUP BY parent 
    ORDER BY timestamp DESC";

此代码按时间戳对每个组进行排序,因此如果 user1 在 user2 之后向我发送消息,则 user1 将在列表中排在第一位。但是,我遇到的问题是每个组中的消息不是按时间戳排序的,因此当我需要它是用户发送的最新消息时,组的输出始终是用户发送的第一条消息。因此,我需要,并按时间戳对整个组进行排序。我一生都无法弄清楚如何做到这一点。有人可以帮忙吗? (parent 是共享两个普通用户的所有消息的公共 ID,无论发送者/接收者如何,即任何两个用户之间的所有消息的集合)。提前致谢!

【问题讨论】:

为什么需要使用group by? 【参考方案1】:

我需要咖啡,所以我希望我能正确阅读您的问题,但这不只是在 order by 语句中添加 parent 的问题吗?

$sqlInbox = "
    SELECT sender, receiver, message, parent, rView
    FROM messages 
    WHERE receiver='$log_username' OR sender='$log_username' 
    GROUP BY parent 
    ORDER BY parent, timestamp DESC";

在该说明中,您没有使用任何聚合函数,因此您可能甚至不需要 group by(除非您在发布的代码中没有做其他事情:

$sqlInbox = "
    SELECT sender, receiver, message, parent, rView
    FROM messages 
    WHERE receiver='$log_username' OR sender='$log_username' 
    ORDER BY parent, timestamp DESC";

最后,如果是我自己的代码,我会考虑在消息中添加一个已读/未读标志,并在 order by 子句中另外使用它:

$sqlInbox = "
    SELECT sender, receiver, message, parent, rView
    FROM messages 
    WHERE receiver='$log_username' OR sender='$log_username' 
    ORDER BY readStatus, parent, timestamp DESC";

这会将整个内容分成两部分 - 顶部的未读消息和底部的已读消息 - 其他顺序与以前相同。

【讨论】:

我试过这个。我只想为每个父组(每个对话)显示 1 条消息(最新消息)。因此,我需要显示单个最新消息的排序组,然后是父级排序的组具有最新消息。

以上是关于按时间戳对组内的行进行排序的主要内容,如果未能解决你的问题,请参考以下文章

按最近的时间戳对 Spark DataFrame 中的行进行重复数据删除

如何按时间戳对数组进行排序?

在 Cloudkit.JS 中按时间戳对记录进行排序

按最近的时间戳对数组中的对象数组进行排序,然后使用 jq 按每个数组的第一个对象的时间戳对外部数组进行排序

根据文件中的时间戳对文件进行排序

Mysql:如何在不丢失组内个人行的情况下对组进行排序[关闭]