【问题标题】:Select all forums and get latest post too.. how?选择所有论坛并获取最新帖子.. 怎么样?
【发布时间】:2014-07-07 16:59:22
【问题描述】:

我正在尝试编写查询以选择我所有的论坛并获取相应的最新帖子(包括作者)...但我失败了。

这是我的结构:

forums                      forum_threads              forum_posts
----------                  -------------             -----------
id                          id                        id
parent_forum (NULLABLE)     forum_id                  content
name                        user_id                   thread_id
description                 title                     user_id
icon                        views                     updated_at
                            created_at                created_at
                            updated_at
                            last_post_id (NULLABLE)

这是我当前的查询:

SELECT forum.id, forum.name, forum.description, forum.icon, post_user.username
FROM forums AS "forum"
LEFT JOIN forum_posts AS "post" ON post.thread_id = (
    SELECT id
    FROM forum_threads
    WHERE forum_id = forum.id
    ORDER BY updated_at DESC LIMIT 1)
LEFT JOIN users AS "post_user" ON post_user.id = post.user_id
WHERE forum.parent_forum = 1
GROUP BY forum.id

这个查询当然是不正确的,因为一个帖子里有很多帖子……

有人可以帮忙吗?顺便说一句,我正在使用 PostgreSQL。

哦:我忘了: 目前,我浏览了所有“类别”(具有 parent_forum = NULL 的论坛),然后为每个论坛运行了一个附加查询(这就是您在我的查询中看到 parent_forum = 1 的原因)。有没有更好的方法来做到这一点?

编辑: 我的最后一篇文章是 forum_posts

中 updated_at 中最新日期的帖子

【问题讨论】:

  • 我不太明白你关于"categories"的第二个问题。我建议为此打开一个 new 问题。每个问题的一个问题是它应该如何。您总是可以参考这个上下文来保护一些多余的输入。
  • 我的意思是每个论坛都有一个“parent_forum”。如果 "parent_forum" 为 NULL,那么它是一个有子论坛的类别。

标签: php sql postgresql greatest-n-per-group forum


【解决方案1】:

DISTINCT ON 应该会让这更容易:

SELECT DISTINCT ON (f.id)
       f.id, f.name, f.description, f.icon, u.username
FROM   forums             f
LEFT   JOIN forum_threads t ON t.forum_id = f.id
LEFT   JOIN forum_posts   p ON p.thread_id = t.id
LEFT   JOIN users         u ON u.id = p.user_id
WHERE  f.parent_forum = 1
ORDER  BY f_id, p.updated_at DESC;

根据您的 Q 更新,最新的帖子是最新的 forum_posts.updated_at
假设列定义为NOT NULL

详解:
Select first row in each GROUP BY group?

【讨论】:

  • 查询不起作用..当我运行它时(使用固定语法),我收到此错误:“列”u.username“必须出现在 GROUP BY 子句中或用于聚合函数”.. 并且 PgSQL 想要按添加的所有列进行分组,它不起作用(我得到“NULL”作为用户名的值)
  • 抱歉 - 我更新了我的问题,所以现在定义了最新的帖子。
  • @CryNickSystems:抱歉,GROUP BY 行是疏忽,现已删除。此查询中没有GROUP BY
  • 它仍然无法正常工作.. "用户名" 保持为 NULL,尽管论坛中有线程和帖子
  • @CryNickSystems:您会收到username最新 帖子。你确定是NOT NULL?您应该已经提供了表定义(psql 中的\d tbl),我们可以在其中看到列是如何定义的...
【解决方案2】:

这就是你的想法吗?您可以使用子查询获取给定论坛的最新帖子。

SELECT forums.id, forums.name, forums.description, forums.icon,
  (SELECT username FROM forum_threads AS ft
  JOIN forum_posts AS fp ON ft.id = fp.thread_id
  JOIN users AS u ON fp.user_id = u.user_id
  WHERE ft.forum_id = forums.id
  ORDER BY updated_at DESC LIMIT 1) AS username_of_latest_post
FROM forums

【讨论】:

  • 您的解决方案似乎很容易理解,但是如果我想从子查询中选择多个列呢?
  • 这让它变得更加棘手。您可以尝试在子查询中使用行构造函数组合多个值,例如SELECT ROW(username, user_id) ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 2015-09-22
  • 2013-06-17
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
相关资源
最近更新 更多