【问题标题】: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?

标签: php mysql sql


【解决方案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 条消息(最新消息)。因此,我需要显示单个最新消息的排序组,然后是父级排序的组具有最新消息。
猜你喜欢
  • 1970-01-01
  • 2018-12-17
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
相关资源
最近更新 更多