首页 > 解决方案 > 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明智地设置。

最好的问候菲利普

标签: mysqlsqllimit

解决方案


假设 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 行号的记录。


推荐阅读