【问题标题】:How do I keep the order of my inner join in SQL?如何在 SQL 中保持内部连接的顺序?
【发布时间】:2021-10-15 20:29:24
【问题描述】:

我有以下命令:

SELECT * FROM Posts P 
INNER JOIN (SELECT DISTINCT ThreadId FROM Posts ORDER BY Time DESC) R 
ON P.Id = R.ThreadId;

此命令选择包含最新回复的线程。不幸的是,线程的顺序似乎是随机的。我希望线程按最新回复排序。换句话说:我希望我的选择保持我在内部连接中使用的顺序。

我怎样才能做到这一点?

【问题讨论】:

  • 你有没有尝试过切换它,所以threadids在“from”段中完成,然后将帖子加入到那里?
  • 好主意,但没成功。

标签: mysql sql sql-order-by window-functions sql-max


【解决方案1】:

对于 MySql 8.0+,您可以在 ORDER BY 子句中使用 MAX() 窗口函数:

SELECT * 
FROM Posts
ORDER BY MAX(Time) OVER (PARTITION BY ThreadId) 

对于以前的版本,使用相关子查询:

SELECT p1.* 
FROM Posts p1
ORDER BY (SELECT MAX(p2.Time) FROM Posts p2 WHERE p2.ThreadId = p1.ThreadId)

您可能还想在 ORDER BY 子句 , Time DESC 中添加第二个参数。

【讨论】:

  • 这解决了我的问题,看起来很优雅。谢谢。
  • 没有采用我的“内连接”方法但找到最有效的解决方案的奖励积分。
【解决方案2】:

您的加入需要分组并选择每个线程的最后一个帖子。订单需要在外部查询(而不是子查询)上进行。

SELECT *
FROM Threads AS t 
LEFT JOIN (
    SELECT ThreadId, MAX(Time) AS LastPost
    FROM Posts
    GROUP BY ThreadId
    ) AS r ON r.ThreadId = t.ThreadId
ORDER BY LastPost DESC

如果您想排除没有帖子的线程(如果可能的话),您可以使用 INNER JOIN 而不是 LEFT JOIN。

【讨论】:

    【解决方案3】:

    您可以像这样更改查询的顺序

        SELECT  ...
        FROM    BrandsProducts
        INNER JOIN Brands ON BrandsProducts.brandid = BrandsProducts.brandid
        WHERE   ...
        ORDER BY ...
    

    【讨论】:

      猜你喜欢
      • 2018-05-06
      • 2017-07-31
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多