按时间戳对组内的行进行排序
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 中的行进行重复数据删除