2010-08-24 34 views
3

我创建了一个功能,用户可以在其中开始新的主题(类似于论坛)。 在一个页面上的那一刻,都为主题的查询,如下所示:按另一个表中的帖子排序

$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 "; 

的表常数和传入的偏移和rowsperpage是变量限制多少职位是一个页面上。

目前,所有的主题都是按日期排序的。 我希望他们按最新的回应排序。 与论坛类似,当主题内的回应是最新的时候,该主题将回到顶部。

主题存储在tbl_communitythreads和tbl_communityreplies中的回复中。

我怎么能通过最新的repsonse命令他们。

它们通过tbl_communityreplies中的threadid链接。还有一个是日期栏。

谢谢你的阅读,我只是不能想到如何做到这一点。

回答

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) 

这种工作速度快。

+0

你好,谢谢你的回复。 你是什么意思创建以下指标? – sark9012 2010-08-24 12:40:46

+0

@Luke:索引是表的某些列中的数据的影子副本,按这些列的值排序。它们有助于提高查询的性能。 – Quassnoi 2010-08-24 12:43:41

+0

我会谷歌它并了解更多。 我使用了第一个查询并将其更改为匹配我的系统。 完美的作品,非常感谢你! – sark9012 2010-08-24 12:45:48

0

通过加入与另一个表,然后你可以从这个表列按顺序。