我在编写执行以下操作的MySQL查询时遇到问题:
从最近的帖子(最大时间戳)的时间戳(按降序排列)中选择线程表排序中的所有threadID,其中threadID等于每个线程的threadID。所以基本上我想通过线程并让MySQL检查数据库让我们说线程0.它然后检查所有线程ID为0的帖子,并根据thread0内的帖子的最大时间戳排序thread0。然后它为thread1,thread2等重复此操作并相应地对它们进行排序。
这甚至可能吗?它是为了创建论坛的“碰撞系统”效果,其中最近活动的线程连续碰到列表的顶部,直到线程消失,然后它下降到底部。我曾经使用过不同的实现,我在线程表中存储了一个lastActivity时间戳,并在新帖子提交到线程时对其进行了更新,但是这个查询会提高效率。
非常感谢!这里有两个相关的表:线程和帖子。这些帖子有一个threadID字段,用于存储它所属的线程的ID,并且还有一个时间戳字段。线程有一个字段threadID,对应于帖子的threadID。
答案 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上对我有用。如果您想要在查询中包含有关每个主题的更多信息,则必须将列添加到SELECT
和GROUP 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;