MySQL:查找一条记录的行号,并使用LIMIT选择-50 + 50条记录

时间:2019-02-28 18:48:48

标签: mysql sql limit

MySQL版本是5.7.2x。

我的确在一个表中列出了大约1000条记录。它们通过字段start_date进行排序。 我想加载100条这些记录以在UI中显示为列表。但是不是前100个左右,而是已知ID之前的50条记录和已知ID之后的50条记录(例如id = 511的记录)。

当然,在一个请求中完成此操作将是完美的,我也将寻求具有2个请求的解决方案。例如。一个请求找出行号id 511的请求将在所有记录中进行选择,然后在第二个请求中真正选择了正确设置LIMIT X, Y的记录。

我正在努力寻找具有id的项目的位置,以便我可以明智地设置LIMIT

最好的问候 菲利普

1 个答案:

答案 0 :(得分:0)

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