如何限制已经选择的查询?

时间:2019-01-09 16:31:29

标签: php mysql

我正在尝试限制已选择的查询。我知道我可以在查询选择中直接执行此操作,但是由于代码的某些逻辑,如果这样做,我必须运行两次查询选择(我相信)会增加计算时间! 所以,我正在尝试的是这样:

$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是一个对象,因此无法提供预期的结果。

生成一个NULL
array_slice($query1, $start, $length, FALSE)

1 个答案:

答案 0 :(得分:0)

如果您已经执行了查询并且结果集已返回到PHP,则不能然后 LIMIT。如您所述,然后对同一查询的子部分运行第二次SQL执行是浪费和重复的。

D R Y 我们自己。

DRY

正如我上面所说,重复会导致可维护性问题,因为您可以轻松地忘记重复,调整一个SQL而忘记调整另一个。

D R Y 我们自己。

DRY

改用PHP

执行查询后,结果集将被传递回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或其他标准数组操作技术中使用它们。