mysql - MySQL:查找一条记录的行号并使用 LIMIT 选择 -50+50 条记录
问题描述
MySQL 版本是 5.7.2x。
我确实有一个表中有大约 1000 条记录的列表。它们按字段排序start_date
。我想加载其中的 100 条记录以在 UI 中显示为列表。但不是前 100 条左右,而是已知 id 之前的 50 条记录和之后的 50 条记录(例如id
= 511 的记录)。
当然,在一个请求中完成这项工作将是完美的,我也会寻求一个有 2 个请求的解决方案。例如,查找行号 id 511 的请求将在所有记录中进行选择,然后在具有LIMIT X, Y
正确设置的第二个请求中真正选择记录。
我正在努力的是找出带有 id 的项目的位置,所以我可以LIMIT
明智地设置。
最好的问候菲利普
解决方案
假设 MySQL 8.0,应该可以用 CTE 和 解决这个问题ROW_NUMBER()
:
WITH cte AS (
SELECT
t.*,
ROW_NUMBER() OVER(ORDER BY start_date) rn_asc
FROM mytable t
)
SELECT c2.*
FROM cte c1
INNER JOIN cte c2 ON c2.rn >= c1.rn - 50 AND c2.rn < c1.rn + 50
WHERE c1.id = 511
CTE 为每条记录分配一个行号,按 . 排序start_date
。然后,主查询选择具有 id 的记录511
,并与 CTE 自联接以提取具有 +/-50 行号的记录。
推荐阅读
- trailing-slash - URL wordpress /空白页末尾的斜杠
- typescript - 使用打字稿的Angular 6的黄金布局?
- javascript - JavaScript if else 条件在fullcalendar上设置事件颜色不起作用
- javascript - 无法使用为 vue cli 3 设置添加的 babel-plugin-transform-object-rest-spread 传播对象
- php - 带有 assoc 和 for 循环 php 的二维数组
- java - MethodArgumentTypeMismatchException 使用 curl 调用 Rest 方法
- c++ - Boost.Asio/OpenSSL HTTPS GET 证书问题
- java - 需要一个功能接口来操作字符串
- android - Android Studio:如何在 build.gradle 中定义自定义宏(针对不同的构建变体)并让原生 C/C++ 代码检测它们?
- jenkins - 如何为单个 Jenkins 作业设置两个不同的调度程序