例如,在 sql server 2005 中有 top 关键字,如果我在多个表上有联接并且想检索每个 ID/列的极端,如何在 mysql 中选择前 1 行。 Limit 限制了编号。行返回,所以它不能解决我的问题。
最佳答案
SELECT v.*
FROM document d
OUTER APPLY
(
SELECT TOP 1 *
FROM version v
WHERE v.document = d.id
ORDER BY
v.revision DESC
) v
或
SELECT v.*
FROM document d
LEFT JOIN
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY v.id ORDER BY revision DESC)
FROM version
) v
ON v.document = d.id
AND v.rn = 1
如果您的文档通常修改很少,需要选择所有或几乎所有文档,则后者效率更高;如果文档有很多修订,或者您只需要选择一小部分文档,则前者效率更高。
更新:
抱歉,没注意到问题是关于MySQL
的。
在 MySQL
中,您可以这样做:
SELECT *
FROM document d
LEFT JOIN
version v
ON v.id =
(
SELECT id
FROM version vi
WHERE vi.document = d.document
ORDER BY
vi.document DESC, vi.revision DESC, vi.id DESC
LIMIT 1
)
在 version (document, revision, id)
上创建复合索引以使其快速运行。
关于sql - MYSQL多表join前N行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2250474/