我想检索从第n行开始的表中的所有行。
例如,如果表有20行和n=9
,我想检索所有元素,其中检索到的元素的第一部分是从9到20的元素,第二部分是从1到8的元素。
[9,10,...,19,20,1,2,...,7,8]
.
起初,我认为我可以使用2个查询来使用LIMIT
和OFFSET
。
//retrieve the 2nd group
SELECT * FROM Tname WHERE 1 LIMIT (Tsize-n+1) OFFSET (n)
//retrieve the 1st group
SELECT * FROM Tname WHERE 1 LIMIT (n-1)
我在检索元素之前计算Tsize-n+1
, n
和n-1
,并在检索元素之后将两个数组合并。
但是我不认为这是最优的解决方案(我不想使用多个查询)。而计算表中元素的数量是消耗的)。
有更好的方法吗?
我有一个简单的想法。只需选择所有行,然后读取前n行,最后读取剩下的行直到末尾。只是!
你也可以试试这个:
(SELECT * FROM Tname WHERE id >= n)
UNION (SELECT * FROM Tname WHERE id < n)
您可以使用一个小技巧来做到这一点:
SELECT * FROM Tname ORDER BY id >= n DESC, id ASC
这样就得到了顺序为[9,10,...,19,20,1,2,...,7,8]
的结果。
如果这不起作用(你不知道应该用什么id作为边界),你可以在PHP中重新排列结果:
$n = 9;
$resultsArray = array_merge(
array_slice($resultsArray, $n),
array_slice($resultsArray, 0, $n)
);
按列倒序传递偏移量和限制
$data = SELECT * FROM table;
在php中krsort($data);
$chunked_data = array_chunk($data,9);