如何在 SQL 中保持内部联接的顺序?

How do I keep the order of my inner join in SQL?

我有以下命令:

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

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

我怎样才能做到这一点?

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

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

您的加入需要分组并且 select 每个线程的最后一个 post。订单需要走外查询(不是子查询)

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

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

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

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