sql - MYSQL多表join前N行

标签 sql mysql greatest-n-per-group

例如,在 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/

相关文章:

sql - 使用 Big Query 从每个组中选择第一行并按计数

mysql - 比较 MySql 中 2 个表中的 2 列

mysql - 选择日期相等且 ID 相等的行,并将这些行计为一个

MySQL 查询性能 - 子查询与 Join

SQL查询提取每个类别中得票最多的前3条记录

mysql - 数据插入后如何为sql表创建索引号列?

sql - 从 SQL 连接中删除镜像对

Windows 中的 mysql.exe 输出 CSV 文件

mysql - 使用单个 MySQL 表的各种条件优化 SQL 查询以获得最大值

database - Postgres 通过以下方式获得组中的第一项