1

我无法形成执行以下操作的 MySQL 查询:

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

这甚至可能吗?就是为了创造论坛的“bump-system”效果,最近活跃的帖子不断地被顶到列表的顶部,直到帖子消失,然后下降到底部。我曾经使用不同的实现,我将 lastActivity 时间戳存储在线程表中,并在将新帖子提交到线程时更新它,但是这个查询会使事情变得更有效率。

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

4

3 回答 3

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.

于 2009-04-07T16:05:53.340 回答
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;

此查询服务于您的主要请求,这是我最近评论排序的线程列表。它不会按原样返回没有注释的线程,您需要将连接更改为外部连接才能做到这一点。

于 2009-04-07T16:05:58.927 回答
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;
于 2009-04-07T17:25:38.330 回答