选择从给定行号开始的给定行数,必要时循环到表的开头的最佳方法是什么?
如果$starting_offset
和$limit
的总和大于表中的行数,则以下内容不起作用:
SELECT *
FROM table
ORDER BY sort_order ASC
LIMIT $starting_offset, $limit
我需要始终选择$limit
行数,除非表中的行数少于$limit
行。
像这样:
SELECT * FROM
(
(
SELECT *
FROM table
ORDER BY sort_order ASC
LIMIT $starting_offset, $limit
) AS table1
UNION ALL
(
SELECT *
FROM table
ORDER BY sort_order ASC
LIMIT $limit
) AS table2
)
ORDER BY sort_order ASC
LIMIT $limit
第一个子查询尝试获取从$offset
开始的$limit
行。第二个子查询获取前$limit
匹配行(即从偏移量 0 开始),因此如果第一个子查询返回的行少于$limit
行,则第二个子查询将"填充"其余行,从而保证结果集中总共有$limit
行(假设至少有这么多行)。
另外: https://dba.stackexchange.com/questions/167768/perform-mysql-limited-select-that-wraps-when-it-reaches-the-end-of-table
编辑:添加了最终ORDER BY
子句(如果您始终希望对结果进行排序,则可选)。