我想从第n行开始从表中检索所有行。
例如,如果表有20行和n=9
,我想检索所有元素,其中检索元素的第一部分是从9到20的元素,第二部分是从1到8的形式。
[9,10,...,19,20,1,2,...,7,8]
。
起初,我认为我可以使用LIMIT
和OFFSET
使用2个查询来执行此操作。
//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
的位置,我将两个数组合并。
但我不认为这是最佳解决方案(我不想使用多个查询。并且计算表中元素的数量正在消耗)。
有更好的方法吗?
答案 0 :(得分:1)
您可以使用小技巧来执行此操作:
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)
);
答案 1 :(得分:1)
你也可以试试这个:
(SELECT * FROM Tname WHERE id >= n)
UNION (SELECT * FROM Tname WHERE id < n)
答案 2 :(得分:1)
我有一个简单的想法。只需选择所有行,然后读取前n行,最后读取剩余的行到最后。就是这样!
答案 3 :(得分:0)
按任意列反转顺序并传递偏移和限制
$data = SELECT * FROM table;
在php中
krsort($data);
$chunked_data = array_chunk($data,9);