我创建了一个功能,用户可以在其中启动新主题(类似于论坛)。 目前,在页面上,主题的查询如下:
$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链接。另外一个是日期栏。
谢谢你的阅读,我只是想不出怎么做。
答案 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)
加入与另一个表,然后您可以从此表中按列排序。