按另一个表中的帖子排序

时间:2010-08-24 12:21:39

标签: 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_community中的回复则存储。

我如何通过最新的回复订购它们。

它们由tbl_communityreplies中的threadid链接。另外一个是日期栏。

谢谢你的阅读,我只是想不出怎么做。

2 个答案:

答案 0 :(得分:1)

此:

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)

让它快速工作。

答案 1 :(得分:0)

加入与另一个表,然后您可以从此表中按列排序。