当前位置: 首页 > 面试题库 >

SQL:选择最新主题和最新帖子,按论坛分组,按最新帖子排序

秦昊穹
2023-03-14
问题内容

我正在尝试

  • 最新线程 (ID,主题,时间戳,author_id)和
  • 最新帖子 (id,thread_id,时间戳,author_id)
  • 每个论坛 (ID,姓名)
  • 由最新帖子排序 ,与该线程的创建日期无关。

为什么?

我希望能够显示以下详细信息:

"The latest Answer of forum $forum_id was given on Question $thread_id. Here it is: $post_id"
SELECT  f.id AS forum_id,
        f.name AS forum_name,
        t.id AS thread_id,
        t.topic AS thread_topic,
        t.ts AS thread_timestamp,
        p.id AS post_id,
        p.content AS post_content,
        p.ts AS post_timestamp

 FROM   forums f,
        threads t,
        posts p

WHERE   f.id = t.forum_id 
  AND   t.id = p.thread_id

GROUP BY f.id
ORDER BY p.ts

有什么建议,如何更改SQL以尽可能获得所需的结果?我试图避免子查询,但我思想开放!

提前致谢!


问题答案:

由于MySQL不支持窗口函数,因此我认为没有子查询就无法实现这一点:

SELECT  f.id AS forum_id,
    f.name AS forum_name,
    t.id AS thread_id,
    t.topic AS thread_topic,
    t.ts AS thread_timestamp,
    p.id AS post_id,
    p.content AS post_content,
    p.ts AS post_timestamp

FROM   forums f
JOIN (SELECT t2.forum_id, max(p2.ts) as ts
      FROM posts p2
      JOIN threads t2 ON p2.thread_id = t2.id
      GROUP BY t2.forum_id) max_p ON f.id = max_p.forum_id
JOIN   posts p ON max_p.ts = p.ts
JOIN   threads t ON f.id = t.forum_id AND p.thread_id = t.id
ORDER BY p.ts

自然地,缓存最新结果将使您无需调用MAX()即可降低性能,但是有了正确的索引,这应该不是什么大问题了…

更新

包括无帖子的线程和无主题的论坛的最简洁的方法是使用LEFT JOIN而不是INNER JOIN:

SELECT  f.id AS forum_id,
    f.name AS forum_name,
    t.id AS thread_id,
    t.topic AS thread_topic,
    t.ts AS thread_timestamp,
    p.id AS post_id,
    p.content AS post_content,
    p.ts AS post_timestamp

FROM   forums f
LEFT JOIN (SELECT t2.forum_id, max(COALESCE(p2.ts, t2.ts)) as ts, COUNT(p2.ts) as post_count
      FROM threads t2 
      LEFT JOIN posts p2 ON p2.thread_id = t2.id
      GROUP BY t2.forum_id) max_p ON f.id = max_p.forum_id
LEFT JOIN   posts p ON max_p.ts = p.ts
LEFT JOIN   threads t ON f.id = t.forum_id AND (max_p.post_count = 0 OR p.thread_id = t.id)
ORDER BY p.ts


 类似资料:
  • 我有一个静态页面,其中10个容器位于index.php文件的不同位置,我想显示10篇最新文章。我想像这样回显帖子的数据(标题、文本、缩略图、作者、时间): 我的PHP文件: 提前谢谢,我感谢你能提供的任何帮助。

  • 自动检测设定论坛最新帖子,显示最新帖子列表,新帖自动提示,让你成为论坛抢沙发第一人!

  • 问题内容: 一个has_many 。我想检索每天的最新帖子(使用),而忽略其他可能早些写的帖子。提出此问题的另一种方法可能是按部门要求每个最高薪水收入的雇员- 我认为也是一样。 如何在Rails(最好是4.0)中编写此查询?我认为这与它有关,但我似乎无法理解。有没有办法不用SQL来做到这一点? 为了明确起见,我想返回的是一系列post对象,它们是在各自日期上最后写入的对象。 谢谢! 问题答案: 它

  • 问题内容: 我正在尝试获取与我下载的每个帖子相关的最新1或2条评论,有点像instagram一样,因为它们显示每个帖子的最新3条评论,到目前为止,我正在获得帖子和喜欢的计数。 现在,我需要做的就是弄清楚如何获取最新评论,而不是太确定如何处理它,这就是为什么我希望拥有更多专业知识的人可以为我提供帮助! 这是我当前的查询: 基本上,评论与点赞存储在同一表中。 所以表是,然后我有一列存储注释文本,然后“

  • 问题内容: 我在SO上看到过类似类型的问题,但是,我无法找到针对我特定问题的解决方案。(仅供参考,这些不是我的真实专栏,只是一个简短的示例)。 我有一个基本表: 因此,我想做的是能够: 我已经尝试过类似的东西: 但这不会返回我要查找的行。修复此查询的任何帮助都将非常有用。 非常感谢。 问题答案: 编辑: 顺便说一句,如果您想知道为什么原来的查询不起作用,让我们分解一下: 从…中选择一些东西 其中=

  • 问题内容: 我有以下表格/列: 有一对多的关系 有一对多的关系 对于每个,我都需要获取最新的价值。如何使用SQL执行此操作。我已经尝试使用,但我似乎无法弄清楚如何参与和成功。 理想结果集将包含与最新记录的所有列结合的所有。 注意:使用 MS SQL 2005+ 问题答案: 看看使用ROW_NUMBER 就像是