php - 在不使用子查询的情况下按升序返回最后 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
解决方案
推荐阅读
- python - 在 tensorflow 中访问 python 列表和张量的优雅方式
- html - 文本不在 div 中
- groovy - Groovy 调用 CountDownLatch.await() 导致挂起
- python-3.x - 置换算法的Big-O分析
- android - 如何在应用程序启动时添加弹出选项屏幕?安卓工作室
- sql-server-2012 - 创建查询以将两个表中的数据与相似数据合并
- git - 使用 Azure DevOps REST Api 如何获取分支的提交哈希?
- vue.js - 传单和 Vuejs。如何在地图中添加新的标记 onclick?
- excel - 如何从列分隔的数据集到逗号分隔的数据集?
- git - 你可以从远程分支“rebase”提交吗?