2011-06-25 54 views
1

我正在使用PHP和MySQL进行基础论坛。我为所有线程使用一个表。它被命名为forum_posts。它具有以下字段:高级MySQL ORDER BY

id, creator, time, title, message, thread_reply, forum_id, locked, sticky 

如果该信息是一个新的线程,然后thread_reply被设置为0。否则,thread_reply设置为线程这个帖子被回复的id。在显示所有线程的页面上,我想在回复最后一个帖子时排序线索。我使用此查询:

SELECT `id`, `title`, `creator` FROM `forum_posts` WHERE `thread_reply` = 0 AND `forum_id` = 1 ORDER BY -`time` 

唯一的问题是,查询由线程创建的时间只有订单,而不是时间的最后答复是给线程。如果您不明白我在说什么,请查看任何论坛的主页,并查看它是如何在最后一篇文章发布到线程时订购线程的,而不是创建线程的时间。

回答

2

我上周做了一个自定义论坛(因为phpbb只是不适合我的需要)。

我首先建议的结构如下:

  • 表用户
  • 表类别(论坛的主要部分)
  • 表线程(这些都是内部类)为
  • 表帖子(这些是在单独的线程)

要订购的最后一个动作的帖子,我简单地创建了af在线程表中被称为last_action或沿着这些线路。

然后,当线程第一次创建时,我将该值设置为创建日期。然后,无论何时编辑帖子或将新帖子添加到该帖子,该值都会更新。这意味着你只需要:

SELECT blah, blah, blah FROM threads WHERE cat=4 ORDER BY last_action DESC 

希望可以帮助你。

-1

由于您只是通过该查询获取“开始”帖子,您无法通过最新回复进行排序。您需要添加另一列(last_reply_time等),并让您的应用程序在每次发布新线程时都更新该字段,然后按此顺序进行排序。

+0

或使用相关的子查询。 –

+1

我应该添加很多论坛系统,将“线程”数据与“发布”数据分开,以便使问题更容易解决。他们有一个包含它所在论坛的线程表,启动它的用户以及上次回复的时间,并且通常是最近添加的帖子的ID等。然后,实际的帖子位于完全不同的表格中。 –

0

使用

SELECT `op`.`id`, `op`.`title`, `op`.`creator` 
FROM `forum_posts` `op`, `forum_posts` `rep` 
WHERE (`op`.`thread_reply` = 0 OR `op`.`thread_reply` = `rep`.`id`) 
    AND `op`.`forum_id` = 1 
ORDER BY IF(`op`.`thread_reply` = 0, -`op`.`time`, -`rep`.`time`) 

基本上我在这里做的是找到了回应,如果适用,以便通过它的时间。

+0

这只是让它以随机顺序将所有帖子打印为线索:o – Matt

0

如果你有方法可行:

创建两个表:

主题:ID,主题,DATE_CREATED,date_last_reply ..

帖子:ID,thread_id单,日期, ..

SELECT * FROM threads ORDER BY date_last_reply 
1

最简单的方法可能是使得它使用测试thread_reply=0的ead,您使用测试thread_reply=id。让一个线程启动线程成为自己的回复。如果你使用的是其他东西,可能使它更有点凌乱,但因此,你可以做这样的事情

SELECT * FROM 
    (SELECT `id`, `title`, `creator`, b.rtime FROM `forum_posts` 
     WHERE a.`thread_reply` = a.`id` AND `forum_id` = 1) a 
    LEFT JOIN (SELECT `thread_reply`, MAX(`time`) rtime FROM `forum_posts` 
     WHERE `forum_id`=1 
     GROUP BY `thread_reply`) b ON a.`id`=b.`thread_reply` 
    ORDER BY `rtime` DESC 

注意第一个子查询是不必要的,但它可能是更有效的第一滤波器通过论坛和“这是第一篇文章”。

另外,为什么在使用ORDER BY time DESC时使用ORDER BY -time ASC

但是,最好的方法可能只是为主题设置一个表格,并为答复设置一个表格。 (在一个主题中的第一个回复是第一篇文章;该主题本身没有内在的正文)