我创建了一个用户可以开始新主题的功能(类似于论坛)。 目前在一个页面上,查询主题如下:
$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/