【问题标题】:Problem joining tables where joined table needs to be ordered before grouping在分组之前需要对连接表进行排序的连接表的问题
【发布时间】:2011-01-21 10:47:49
【问题描述】:

我有一个场景,在纸面上看起来很简单,但在实践中我无法按预期工作。

我有两个表(仅显示相关列):

| Thread
+----------
| ThreadID 

| Post
+----------
| PostID
| ThreadID
| Posted (Datetime)

现在,我想做的是加入 Thread 和 Post,按 ThreadID 分组。但我想按 Post.Posted 降序排序。用简单的英语,我想在与它相关的最新帖子上加入 Thread。

到目前为止我的 SQL:

SELECT Thread.ThreadID, Post.PostID, Post.Created
FROM Thread
LEFT JOIN Post ON Post.ThreadID = Thread.ThreadID
GROUP BY Thread.ThreadID
ORDER BY Post.Created DESC 

它完成了这项工作,但连接的顺序不正确,因为排序当然只在执行分组后应用。

当然,必须有一种方法来完成我的需要?

【问题讨论】:

    标签: sql join group-by sql-order-by


    【解决方案1】:
    select t.ThreadID, p.PostID, p.Posted
    from Thread t
    inner join (
        select ThreadID, Max(Posted) as MaxPosted
        from Post
        group by ThreadID       
    ) pm on t. ThreadID = pm.ThreadID
    inner join Post p on pm.ThreadID = p.ThreadID and pm.MaxPosted = p.Posted
    order by p.Posted desc
    

    【讨论】:

      【解决方案2】:

      在 order by 子句中同时使用线程 id 和创建日期

      SELECT Thread.ThreadID, Post.PostID, Post.Created
      FROM Thread
      LEFT JOIN Post ON Post.ThreadID = Thread.ThreadID
      GROUP BY Thread.ThreadID
      ORDER BY Thread.ThreadID, Post.Created DESC 
      

      【讨论】:

      • 谢谢,这行得通。你能再解释一下吗?
      • @nikc:我以为要求是“我想在最近的帖子上加入线程”?这不一定会给你最新的。事实上,我认为 PostID 和 Created 在这个查询中不一定会引用相同的记录。
      • @OrbMan:是的,这是要求。根据我有限的测试数据,它似乎可以解决问题。
      猜你喜欢
      • 1970-01-01
      • 2023-03-19
      • 2019-10-13
      • 2010-11-18
      • 2021-03-18
      • 2013-03-05
      • 2017-11-09
      • 1970-01-01
      • 2021-08-05
      相关资源
      最近更新 更多