【问题标题】:How to LIMIT a Query which is already been selected?如何限制已选择的查询?
【发布时间】:2019-01-09 16:31:28
【问题描述】:

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

$query1 = $mysqli->query("SELECT * FROM tableName  WHERE someconditions");

然后,我需要为我的分页重新选择 $query1 的子选项。我正在尝试做的是这样的事情;

$query2 = LIMIT($query1, $limit_bigin, $limit_end);

其中$limit_bigin$limit_end 提供 LIMITING 范围(分别为开始和结束)。

有人可以告诉我如何做到这一点吗?

附:我知道我可以直接通过:

$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)

【问题讨论】:

  • 如果你一定要先运行无限制查询,为什么不在PHP中进行限制呢?
  • 如果您已经从数据库中获取了整个查询,为什么还需要通过某种分页再次获取它?只需使用您的 PHP 代码对其进行分页。
  • SQL 在定义上是无序的.. 使用 LIMIT 而不使用 ORDER BY 是没有意义的,即使运行相同的查询两次也不能保证相同的结果。 .
  • 如果您从$query1 获取所有行,您可以使用array_slice() 提取您感兴趣的行。否则您可以使用mysqli_stmt_data_seek() 定位查询并读取您之后的行数。
  • 如何使用 PHP 限制它?谢谢

标签: php mysql


【解决方案1】:

如果你已经进行了查询并且结果集已经返回到你的PHP中,你就不能那么LIMIT它。正如您所说,然后对同一查询的子部分运行第二个 SQL 执行是浪费和重复的。

D不会 R重复 我们自己。

DRY

正如我上面所说,重复会导致可维护性问题,因为您很容易忘记重复,调整一个 SQL 并忘记调整另一个 SQL。

D不会 R重复 我们自己。

DRY

改用 PHP

一旦你执行了查询,结果集就会传回给 PHP。

因此,假设您有一个包含 SQL 查询内容的 $var,那么您只需从 $var 中选择有效行,而不是从数据库中选择 [再次]。

您可以使用 PHP 的众多数组函数来做到这一点。特别是array_slice()

所以;

$query1 = $mysqli->query("SELECT * FROM tableName  WHERE someconditions");

现在,选择第二页,例如第 10 到 20 行:

$query2 = array_slice($query1, (10-1), 10 );

然后这将“切片”您想要的数组部分。请记住,数组计数将从零开始,因此要获取第 10 行(从 1 开始的索引,典型的 MySQL 自动增量主键),然后您需要选择 X 行数来自行 (10-1) 。

请同时阅读 PHP 手册array_slice()

进一步

正如 cmets 中所引用的,无法保证您的 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 或其他标准数组操作技术中使用它们。

【讨论】:

  • 对于排序,我按在数据库表中创建特定行的时间对其进行排序。够了吗?
  • @BuV8 只要是按某种东西排序的,这样重复的查询总是会以相同的顺序返回相同的值。
  • array_slice 给出警告说:array_slice() 期望参数 1 是数组,给定对象(并显示我使用 PHP 进行切片的行),并且没有任何输出(给出 NULL) .....可能出了什么问题?
  • 请参考我的编辑1
  • @BuV8 您的查询中的 结果集 将是一个数据数组,该数组可能保存在一个对象中,但您只需要将其保存为数组$var,即使它在对象内,例如$queryResult->resultArray,然后在你的array_slice()中使用它
猜你喜欢
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 2012-08-12
  • 2019-10-21
  • 2014-09-23
相关资源
最近更新 更多