如何在 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
。
我有以下命令:
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
。