首页 > 解决方案 > 在不使用子查询的情况下按升序返回最后 N 行

问题描述

我想N从表中返回最后一行并按id(PK)升序排列。

传统的智慧是以下列方式准备查询:

--- Get last N rows in Ascending Order 
SELECT t1.*
FROM (

    SELECT *
    FROM table t
    ORDER BY t.id DESC
    LIMIT N
    
) t1
ORDER BY t1.id ASC

我想避免子查询(在这种情况下)的原因是我的 ORM(学说)不支持这个 AFAIK。

我目前有一个解决方法来运行内部查询的结果,array_reverse()但想知道是否有更优雅的解决方案。


Symfony4 和 Doctrine 2.8

我尝试以上述方式运行子查询会导致错误:

[语义错误] line 0, col 41 near 'JOIN (SELECT': Error: Subquery is not supported here

$sub = $this->createQueryBuilder('t2')
    ->select('t2')
    ->orderBy('t2.id', 'DESC')
    ->setMaxResults($numRows);

$qb = $this->createQueryBuilder('t1')
    ->select('t3')
    ->innerJoin(
        sprintf('(%s)', $sub->getDQL()),
        't3',
        Expr\Join::ON,
        't1.id = t3.id'
    )
    ->orderBy('t3.id', 'ASC')
    ->setMaxResults($numRows);

$qb->getQuery()->getResult();

这会生成以下 SQL:

SELECT t3 
FROM Ent1 t1 
INNER JOIN (
    SELECT t2 FROM Ent1 t2 ORDER BY t2.id DESC
) t3 
ON t1.id = t3.id 
ORDER BY t3.id ASC

标签: phpsqldoctrine-ormdoctrine

解决方案


推荐阅读