【问题标题】:How do I use MySQL Join to sort forum threads by their last reply?如何使用 MySQL Join 来按论坛主题的最后回复排序?
【发布时间】:2013-06-16 02:38:24
【问题描述】:

我在为此编写查询时遇到了一些麻烦。我想我有基本的逻辑,虽然我可能没有。我想要做的是根据用户正在查看的版块获取所有线程,然后根据他们上次回复的时间对这些线程进行排序。查询不返回任何错误,它只获取最近更新的线程。

这是我的查询:

$查询 = " 选择 t.child_id, t.thread_id, m.thread_id、m.message_id、m.date_posted FROM forum_threads AS t LEFT JOIN forum_messages AS m ON t.thread_id = m.thread_id WHERE t.child_id = ".$board_id." 按 m.date_posted DESC 排序 限制 ".$starting.", ".$this->user['results_per_page'];

这是正在返回的查询:

选择 t.child_id、t.thread_id、m.thread_id、m.message_id、m.date_posted FROM forum_threads AS t 左加入 forum_messages AS m ON t.thread_id = m.thread_id 哪里 t.child_id = 2 ORDER BY m.date_posted DESC LIMIT 0, 15

更新

我尝试采用 ethrbunny 建议的想法,但我完全不知道导致它返回错误的原因。

$查询 = " 选择 t.board_id, t.thread_id FROM forum_threads AS t 左连接( 选择 m.thread_id,m.message_id FROM forum_messages AS m 哪里 m.thread_id = t.thread_id 按 m.message_id DESC 排序 限制 1 ) 作为 q WHERE t.board_id = ".$board_id." ORDER BY q.date_posted DESC 限制 ".$starting.", ".$this->user['results_per_page'];
您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 11 行的“WHERE t.board_id = 4 ORDER BY q.date_posted DESC LIMIT”附近使用正确的语法

【问题讨论】:

  • 您是否只想在每个线程中发送一条消息,然后按最新消息/线程对整个列表进行排序?
  • 如果你还在苦苦挣扎,请考虑提供一个 sqlfiddle。
  • ethrbunny 或 kickstart 值得赏金,有正确的解决方案。您在更新中发布的信息不足以解决问题。如果您在运行查询之前回显 $query,您将看到您正在调试的确切语句,而不是微不足道的 mysql SQL 语法错误。也许在'as q'之后添加'on(t.thread_id = q.thread_id)'
  • 您想要来自 forum_messages 表的任何详细信息(例如 message_id)吗?如果不是,那么 barryhunter 的解决方案很好,但如果你这样做,那么它不会给出正确的结果。

标签: php mysql join


【解决方案1】:
SELECT ... , MAX(m.date_posted) AS latest_reply ...

GROUP BY t.thread_id
ORDER BY latest_reply DESC ...

但为什么 date_posted 是 TEXT?它不应该是日期时间,还是 int(如果是时间戳)

因为永远无法优化在文本列上运行 MAX,建议使用

MAX(m.message_id) AS latest_reply

相反,由于消息可能按日期顺序插入,因此应该是等效的。


编辑添加: 查询全文写出...

$query = "
SELECT t.thread_id, title, 
    MAX(m.message_id) AS latest_reply 
FROM forum_threads AS t
    LEFT JOIN forum_messages AS m ON t.thread_id = m.thread_id
WHERE t.child_id = ".$board_id."
GROUP BY t.thread_id
ORDER BY latest_reply DESC 
LIMIT ".$starting.", ".$this->user['results_per_page'];

【讨论】:

  • 我尝试了您对 MAX(m.date_posted) 的建议,但也没有用。同样的事情。
  • 啊,你错过了 GROUP BY,最初没有注意到。将其添加到我的查询中。
【解决方案2】:

(SQLFiddle 今天早上和我打架 - 所以这主要是猜测)

select <columns> from forum_threads t0
  left join
  ( select <columns> from forum_messages m0 where m0.thread_id = t0.thread_id 
    order by m0.date_posted desc limit 1) as q0
  order by q0.date_posted desc;

我很好奇为什么你的日期字段是text。这将使排序变得困难。

【讨论】:

    【解决方案3】:

    你可以在 ORDER BY 中使用 SELECT 语句来选择线程回复的最新日期。可以在这里找到一个例子:

    SQL FIDDLE

    你的桌子是这样的:

    SELECT * FROM forum_threads ft ORDER BY (SELECT date_posted FROM forum_messages fm WHERE fm.thread_id = ft.thread_id ORDER BY date DESC LIMIT 1) DESC;
    

    但请查看提供的示例。第一个按线程日期查询订单,第二个按最新回复日期。

    【讨论】:

      【解决方案4】:

      我认为您的查询是正确的,请回显您的查询并检查 LIMIT 的值。

      【讨论】:

      • 我已更新我的问题以包含查询字符串。看起来好像正确返回了 LIMIT 值。
      【解决方案5】:

      简单地进行子选择以获取按线程 id 分组的最新消息,然后将其加入到您的主表中:-

      $query = "SELECT t.board_id, t.thread_id, MaxMessageId
                  FROM forum_threads AS t
                  LEFT JOIN (SELECT thread_id, MAX(message_id) AS MaxMessageId FROM forum_messages GROUP BY m.thread_id ) AS q
                  ON  q.thread_id = t.thread_id 
                  WHERE t.board_id = ".$board_id."
                  ORDER BY MaxMessageId DESC
                  LIMIT ".$starting.", ".$this->user['results_per_page'];
      

      【讨论】:

        【解决方案6】:
        选择 UDID、CID、CType 来自uploaded_design ud 左连接 (选择 CID、CDesign、CType 来自设计评论 按 CID desc 订购)dc 在 ud.UDID = dc.CDesign 由 dc.CDesign 分组 按 dc.CID 订购

        【讨论】:

          【解决方案7】:

          尝试以下查询

          SELECT
              t.child_id, t.thread_id,
              m.thread_id, m.message_id, m.date_posted
          FROM
            forum_threads AS t
            LEFT JOIN forum_messages AS m ON t.thread_id = m.thread_id
            LEFT JOIN forum_messages AS m1 ON m.thread_id = m1.thread_id AND m.date_posted < m1.date_posted
          WHERE
            t.child_id = ".$board_id." AND m1.date_posted is null
          ORDER BY m.date_posted DESC
          LIMIT ".$starting.", ".$this->user['results_per_page'];
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-11-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-28
            相关资源
            最近更新 更多