MYSQL来自多个表连接的前N行

时间:2010-02-12 08:34:46

标签: sql mysql greatest-n-per-group

比如,sql server 2005中有top关键字,如果我在多个表&上加入,如何在mysql中选择前1行。想要检索每个ID /列的极端。限制限制了号码。行返回,所以它无法解决我的问题。

2 个答案:

答案 0 :(得分:3)

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)上创建一个复合索引,以便快速工作。

答案 1 :(得分:0)

如果我理解正确,top也无法解决您的问题。 top完全等同于limit。你正在寻找的是聚合函数,如max()或min(),如果你想要极端的话。例如:

select link_id, max(column_a), min(column_b) from table_a a, table_b b 
where a.link_id = b.link_id group by link_id