【问题标题】:how do I order rows, then group them, then order groups我如何对行进行排序,然后对它们进行分组,然后对组进行排序
【发布时间】:2013-10-25 03:56:24
【问题描述】:

我正在尝试为私人消息创建一个用户收件箱,其中显示 一个 两个人之间最近的消息,并且所有对话也按最近的顺序排列。它应该像 Facebook 消息收件箱一样执行,您可以在其中单击最新消息的预览以查看完整对话,并且对话也按最新排序。这是我到目前为止的声明,但它没有显示任何内容,我无法弄清楚如何解决它。有人有什么建议吗?

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

父列代表完整的对话,因此两个集合人员之间的任何消息,无论发送者或接收者,在表中都将具有相同的父 ID。提前致谢。

【问题讨论】:

标签: php mysql sql


【解决方案1】:

我注意到的一件事是您需要按您选择的所有列进行分组。

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

【讨论】:

  • MySQL 不需要这个。
  • 如果你按所有列分组,分组没有意义,你可以使用SELECT DISTINCT
  • 啊,出于某种原因,我正在考虑使用 distinct 而不是 group by。谢谢,
【解决方案2】:

检查这是否有效..

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

【讨论】:

  • 还是同样的问题。对话按最新消息排序,但每个对话仍显示第一条消息,而不是最新消息。
  • 你的问题是说你没有得到 any 输出,而不是你得到了错误的输出。
  • 对不起。内部选择没有输出,上面的版本输出错误。
【解决方案3】:

睡在上面之后,我想到了逻辑。以下似乎解决了我所有的问题。

$sqlInbox = "
    SELECT a.*
    FROM (SELECT * FROM messages
        ORDER BY timestamp DESC) AS a
    WHERE receiver='$log_username' OR sender='$log_username' 
    GROUP BY parent
    ORDER BY timestamp DESC";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2015-07-16
    • 2018-06-15
    • 2016-09-23
    • 1970-01-01
    相关资源
    最近更新 更多