php - 按另一个表中的帖子排序

标签 php sql

我创建了一个用户可以开始新主题的功能(类似于论坛)。 目前在一个页面上,查询主题如下:

$q = "SELECT ".TBL_COMMUNITYTHREADS.".title, ".TBL_COMMUNITYTHREADS.".id, 
    ".TBL_COMMUNITYTHREADS.".date, ".TBL_COMMUNITYTHREADS.".author, ".TBL_USERS.".username FROM ".TBL_COMMUNITYTHREADS." 
        INNER JOIN ".TBL_USERS." ON ".TBL_COMMUNITYTHREADS.".author = ".TBL_USERS.".id
        WHERE type = '$type'
        ORDER BY date DESC LIMIT $offset, $rowsperpage ";

表格是常量,offset 和 rowsperpage 是传入的变量,用于限制页面上的帖子数。

不过目前,所有主题都按日期排序。 我希望它们按最新的响应进行排序。 与论坛类似,当主题内的回复是最新的时,该主题将置顶。

主题存储在 tbl_communitythreads 中,回复存储在 tbl_communityreplies 中。

如何根据最新的回复订购它们。

它们由 tbl_communityreplies 中的 threadid 链接。该列中还有日期列。

感谢您的阅读,我只是想不出该怎么做。

最佳答案

这个:

SELECT  c.title, c.id, c.date, c.author, u.username,
        (
        SELECT  MAX(reply_date)
        FROM    tbl_communityreplies cr
        WHERE   cr.thread = c.id
        ) AS last_reply
FROM    TBL_COMMUNITYTHREADS c
JOIN    TBL_USERS u
ON      u.id = c.author
ORDER BY
        last_reply DESC, c.id DESC
LIMIT   $offset, $rowsperpage

或者这个:

SELECT  c.title, c.id, c.date, c.author, u.username
FROM    (
        SELECT  cr.thread, cr.reply_date, cr.id
        FROM    tbl_communityreplies cr
        WHERE   (cr.last_reply, cr.id) = 
                (
                SELECT  last_reply, id
                FROM    tbl_communityreplies cri
                WHERE   cri.thread = cr.thread
                ORDER BY
                        thread DESC, last_reply DESC, id DESC
                )
        ORDER BY
                last_reply DESC, id DESC
        LIMIT   $offset, $rowsperpage
        ) q
JOIN    TBL_COMMUNITYTHREADS c
ON      c.id = q.thread
JOIN    TBL_USERS u
ON      u.id = c.author
ORDER BY
        q.reply_date DESC, q.id DESC

对于较大的 $offset 值,或者如果您的线程很少但回复很多,前者查询更有效。

发出以下命令:

CREATE INDEX ix_communitythreads_replydate_id ON TBL_COMMUNITYTHREADS (reply_date, id)
CREATE INDEX ix_communitythreads_thread_replydate_id ON TBL_COMMUNITYTHREADS (thread, reply_date, id)

为了让它快速工作。

关于php - 按另一个表中的帖子排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3556330/

相关文章:

MySQL,为什么这个简单的 'CREATE TABLE' 查询失败?

sql - 不显示使用表连接执行查询时出错

javascript - 使用 Ajax 检查登录表单

php - 安全密码存储

javascript - 如何从输入字段中的json中搜索数据

javascript - 从 Laravel 5.1 中的 sessionStorage 获取值(value)

php - 提取 Twitter 个人资料图像时的类 ="disconnect-collapsed"

sql - 两种 SQL 连接符号有什么区别?

sql - Node JS Sequelize sql 关联

sql - 包括上一行的值