【问题标题】:PHP: Mysql limit range numbersPHP:Mysql 限制范围数
【发布时间】:2013-10-30 10:27:26
【问题描述】:

我想获取表中的记录数,然后将它们除以 4,在将它们除以 4 之后,我想根据我的结果创建具有限制范围的 sql 语句。例如,我有一个包含 8 条记录的表,我将其除以 4,我将创建 2 个 sql 语句,其限制范围为 limit 0,4limit 4,8

最终结果会是这样的

Select * from prop where id=123 LIMIT 0,4

Select * from prop where id=123 LIMIT 4,8

我的方法是使用 for 循环来计算要执行的 sql 语句的数量。 然后在循环中:第一个圈子0-4,第二个圈子是4-8

limit 0-4limit 4-8 上苦苦挣扎

PHP 脚本

include('connect.php');    
$query_1 = "Select COUNT(*) as Total from prop where ref = 'SB2004'";
$results_query_1 = mysql_query($query_1);
 while($row_query_1 = mysql_fetch_array($results_query_1))
 {
        $cnt = $row_query_1['Total'];
 }

 echo $cnt;
 echo "<br>";
 $num_grps = 0;
 if ($cnt % 4 == 0 )
 {
   echo $num_grps = $cnt / 4 ;

 }
$count_chk= $num_grps * 4;
 for ($i=1;$i<=$num_grps;$i++)
{
    //for loop for range
    for()
    {
        $range = '0,4';
        echo "SELECT prop_ref from prop limit".$range;
    }
}

【问题讨论】:

  • 这样做的目的是什么?可能有更好的方法
  • Please, stop using mysql_* functions 在新代码中,它们是officially deprecated。而不是,查看prepared statements,并使用MysqliPDO
  • 我所需要的只是打印 echo 2 select 语句的结果,限制范围为 4 的倍数,因为它将用于中继 divs 的分页插件。除非有准备好的语句打印出 sql 语句
  • 为什么分页插件不能动态构建这些查询?如果你通过 echo 输出它们,那么接下来怎么办——你要把它们复制并粘贴到插件代码中……?
  • 插件不允许。有没有办法让循环动态打印 0,4 和 4,8

标签: php mysql loops


【解决方案1】:

要么你没有理解这个问题,要么没有很好地解释它。

这里最直接的问题是您误解了 LIMIT 子句的语法。第一个参数指定开始的偏移量,第二个参数定义要返回的行数,因此 LIMIT 4,8 将返回 8 行(假设数据集中有 12 行或更多行)。

下一个问题是您没有说明结果是否需要可重现 - 例如。如果您有主键 1 和 2 的行,是否应该始终在同一个查询中返回这些行。在没有显式 ORDER BY 子句的情况下,将根据查询找到它们的顺序返回行。

下一个问题是,当总行数不是 4 的偶数倍时,您还没有解释要如何处理最后一种情况。

您提供的代码计算了 where ref = 'SB2004' 的行数,但随后创建了未过滤的查询 - 为什么?

您提供的代码不会更改查询中的限制 - 为什么?

下一个问题是从不在这样的循环中运行 SELECT 查询的充分理由。你没有解释你打算用选择查询做什么。不过根据后续更新....

 include('connect.php');    
 $query_1 = "Select COUNT(*) as Total from prop where ref = 'SB2004'";
 $cnt = mysql_fetch_assoc(mysql_query($query_1));

 $blocks=$cnt['Total']/4 + (0 == $cnt['Total'] % 4 ? 0 : 1);

 $qry2="SELECT * FROM prop where ref='SB2004' ORDER BY primary_key";
 $res=mysql_fetch_assoc($qry2);

 for ($x=0; $x<$blocks; $x++) {
    print "<div>\n$block<br />\n";
    for ($y=0; $y<4; $y++) {
       print implode(",", @mysql_fetch_assoc($res)). "\n";
    }
    print "</div>\n";
 }

进一步细化这一点很简单,只向数据库发出单个查询。

如果你真的必须生成单独的 SELECT ......

 include('connect.php');    
 $query_1 = "Select COUNT(*) as Total from prop where ref = 'SB2004'";
 $cnt = mysql_fetch_assoc(mysql_query($query_1));

 $blocks=$cnt['Total']/4 + (0 == $cnt['Total'] % 4 ? 0 : 1);

 for ($x=0; $x<$blocks; $x++) {
       $y=$x*4;
       print "SELECT * FROM prop where ref='SB2004' 
           ORDER BY primary_key LIMIT $y,4<br />\n"
 }

【讨论】:

    猜你喜欢
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 2021-10-22
    相关资源
    最近更新 更多