MySQL Query为我正在制作的论坛创建一个“碰撞系统”

时间:2009-04-07 16:01:29

标签: php mysql inner-join

我在编写执行以下操作的MySQL查询时遇到问题:

从最近的帖子(最大时间戳)的时间戳(按降序排列)中选择线程表排序中的所有threadID,其中threadID等于每个线程的threadID。所以基本上我想通过线程并让MySQL检查数据库让我们说线程0.它然后检查所有线程ID为0的帖子,并根据thread0内的帖子的最大时间戳排序thread0。然后它为thread1,thread2等重复此操作并相应地对它们进行排序。

这甚至可能吗?它是为了创建论坛的“碰撞系统”效果,其中最近活动的线程连续碰到列表的顶部,直到线程消失,然后它下降到底部。我曾经使用过不同的实现,我在线程表中存储了一个lastActivity时间戳,并在新帖子提交到线程时对其进行了更新,但是这个查询会提高效率。

非常感谢!这里有两个相关的表:线程和帖子。这些帖子有一个threadID字段,用于存储它所属的线程的ID,并且还有一个时间戳字段。线程有一个字段threadID,对应于帖子的threadID。

3 个答案:

答案 0 :(得分:2)

SELECT  *
FROM    threads t
LEFT JOIN
        posts p
ON      p.id =
        (
        SELECT  p.id
        FROM    posts pi
        WHERE   pi.threadID = t.threadID
        ORDER BY
                pi.timestamp DESC
        LIMIT 1
        )

posts (threadID, timestamp)上建立索引将大大改善此查询。

请注意,与GROUP BY解决方案不同,此查询还会选择posts中的所有字段,即使您在最新的posts.timestamp上有重复项也可以使用。

答案 1 :(得分:2)

以下在MySql上对我有用。如果您想要在查询中包含有关每个主题的更多信息,则必须将列添加到SELECTGROUP BY

select thread.threadID, max(comments.modifiedOn) as threadUpdated 
   from thread inner join comments on thread.threadID = comments.threadID 
   group by 1 
   order by 2 desc;

此查询为您的主要请求提供服务,该请求是我最近评论所订购的线程列表。它不会返回没有注释的线程,您需要将连接更改为外连接才能执行此操作。

答案 2 :(得分:0)

SELECT t.*, p1.`timestamp`
FROM threads t 
  JOIN posts p1 ON (p1.threadid = t.id)
  LEFT JOIN posts p2 ON (p2.threadid = t.id 
    AND p1.`timestamp` < p2.`timestamp`)
WHERE p2.threadid IS NULL
ORDER BY p1.`timestamp` DESC;