0

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

$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,无论发送者/接收者如何,即任意两个用户之间的所有消息的集合)。提前致谢!

4

1 回答 1

1

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

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

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

于 2013-10-24T23:40:53.660 回答