我正在尝试限制已选择的查询。我知道我可以在查询选择中直接执行此操作,但是由于代码的某些逻辑,如果这样做,我必须运行两次查询选择(我相信)会增加计算时间! 所以,我正在尝试的是这样:
$query1 = $mysqli->query("SELECT * FROM tableName WHERE someconditions");
然后,我需要为分页重新选择$ query1的子选择。我想做的就是这样;
$query2 = LIMIT($query1, $limit_bigin, $limit_end);
其中$limit_bigin
,$limit_end
提供了LIMITING范围(分别为开始和结束)。
有人可以让我知道我该怎么做吗?
P.S。我知道我可以直接通过以下方式做到这一点:
$query1 = $mysqli->query("SELECT * FROM tableName WHERE someconditions");
$query2 = $mysqli->query("SELECT * FROM tableName WHERE someConditions LIMIT $limit_bigin, $limit_end");
但这会使查询运行两次,并减慢了处理速度(由于程序的某些逻辑,我必须无限制地运行第一个查询)
编辑1 根据答案,我尝试在PHP中使用 array_slice 。但是,由于Query是一个对象,因此无法提供预期的结果。
生成一个NULLarray_slice($query1, $start, $length, FALSE)
答案 0 :(得分:0)
如果您已经执行了查询并且结果集已返回到PHP,则不能然后 LIMIT
。如您所述,然后对同一查询的子部分运行第二次SQL执行是浪费和重复的。
D R Y 我们自己。
DRY。
正如我上面所说,重复会导致可维护性问题,因为您可以轻松地忘记重复,调整一个SQL而忘记调整另一个。
D R Y 我们自己。
DRY。
执行查询后,结果集将被传递回PHP。
因此,假设您有一个包含SQL查询内容的$var
,则只需要从$var
而不是从数据库中选择有效的行即可。
您可以使用PHP的许多Array函数来执行此操作。特别是array_slice()
。
所以;
$query1 = $mysqli->query("SELECT * FROM tableName WHERE someconditions");
现在,要选择第二页,例如说第10至20行:
$query2 = array_slice($query1, (10-1), 10 );
然后将“切片”所需数组的一部分。请记住,数组计数将从零开始,因此要获取第10行(索引从1开始的值,这是典型的MySQL Auto Increment主键),那么您将需要从 from 中选择X个行第(10-1)行。
还请阅读PHP array_slice()
的手册。
如注释中所述,没有保证您的SQL每次以相同的顺序返回相同的值,因此强烈建议对结果进行排序:
$query1 = $mysqli->query("SELECT * FROM tableName
WHERE someconditions ORDER BY primary_key_column");
$query1 = $mysqli->query("SELECT * FROM tableName WHERE someconditions ORDER BY id");
/***
$query1 = array {
0 => array { 'id' => 1, 'user' => "Jim", 'colour' => "Blue" },
1 => array { 'id' => 2, 'user' => "Bob", 'colour' => "Green" },
2 => array { 'id' => 3, 'user' => "Tom", 'colour' => "Orange" },
3 => array { 'id' => 4, 'user' => "Tim", 'colour' => "Yellow" },
4 => array { 'id' => 5, 'user' => "Lee", 'colour' => "Red" },
5 => array { 'id' => 6, 'user' => "Amy", 'colour' => "Black" }
}
***/
$page = 2;
$size = 3; // number per page.
$start = ($page - 1) * $size; //page number x number per page.
// Select the second page of 3 results.
$query2 = array_slice($query1, $start, $size , FALSE);
/***
$query2 = array {
0 => array { 'id' => 4, 'user' => "Tim", 'colour' => "Yellow" },
1 => array { 'id' => 5, 'user' => "Lee", 'colour' => "Red" },
2 => array { 'id' => 6, 'user' => "Amy", 'colour' => "Black" }
}
***/
然后可以在foreach
或其他标准数组操作技术中使用它们。