php - 我如何使用 MySQL Join 按最后回复对论坛主题进行排序?

标签 php mysql join

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

这是我的查询:

$query = "
            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
            WHERE t.child_id = ".$board_id."
            ORDER BY m.date_posted DESC
            LIMIT ".$starting.", ".$this->user['results_per_page'];

这是返回的查询:

            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   
            WHERE t.child_id = 2   
            ORDER BY m.date_posted DESC LIMIT 0, 15 

enter image description here

enter image description here

更新

我尝试采用 ethrbunny 提出的想法,尽管我完全不知道是什么导致它返回错误。

$query = "
            SELECT
            t.board_id, t.thread_id
            FROM forum_threads AS t
            LEFT JOIN (
            SELECT m.thread_id, m.message_id
            FROM forum_messages AS m
            WHERE m.thread_id = t.thread_id
            ORDER BY m.message_id DESC
            LIMIT 1
            ) AS q
            WHERE t.board_id = ".$board_id."
            ORDER BY q.date_posted DESC
            LIMIT ".$starting.", ".$this->user['results_per_page'];
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE t.board_id = 4 ORDER BY q.date_posted DESC LIMIT' at line 11

最佳答案

SELECT ... , MAX(m.date_posted) AS latest_reply ...

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

但为什么 date_posted 是文本?它不应该是日期时间,或者可能是 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'];

关于php - 我如何使用 MySQL Join 按最后回复对论坛主题进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17193313/

相关文章:

c# - 可以通过存储过程创建 View 吗?

mysql - Jackson @JsonIgnore Annotation - 关系值不会被返回

mysql - 使用 JOIN 在多个表上自由搜索

sql-server - 如何查找具有重复值的 MIN 并将 MIN 值替换为 varchar

javascript - JS 字节数组到 PHP 端的文件

php - Jquery、Ajax、PHP : Editing mysql entries

php - 交响乐 2 : how to send an email using Swiftmailer

php - laravel 5 中的配置缓存导致找不到 View

php - 使用 php 和 'if changed' 选项创建 xml

mysql 计数连接双结果