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


order rows within group by timestamp

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

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

此代码按时间戳对每个组进行排序,因此如果用户 1 在用户 2 之后向我发送消息,则用户 1 将排在列表中的第一个。但是,我遇到的问题是每个组中的消息没有按时间戳排序,因此组的输出始终是用户发送的第一条消息,而我需要它是用户发送的最新消息。因此,我需要按时间戳对组中的行进行排序,以及按时间戳对整个组进行排序。我一辈子都想不通该怎么做。有人可以帮忙吗?(parent 是共享两个公共用户的所有消息的公共 ID,无论发送方/接收方如何,即任何两个用户之间所有消息的集合)。提前感谢!

我需要咖啡,所以我希望我正确阅读了您的问题,但这不就是按语句将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";

在这一点上,你没有使用任何聚合函数,所以你可能甚至不需要分组依据(除非你在你发布的代码中没有做其他事情:

$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";

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