【问题标题】:Limit a MySQL query to an even number of results将 MySQL 查询限制为偶数个结果
【发布时间】:2010-10-01 23:32:37
【问题描述】:

我有一些 PHP 代码需要从 MySQL 数据库返回偶数个结果。我正在使用 mysqli 扩展来执行我的查询。

目前我的代码大致是这样的:

//assume we already have a database connection

$query = "SELECT id 
            FROM movies 
           WHERE publish = 1
             AND showimage = 1
        ORDER BY date DESC
           LIMIT 6";

$result = $connection->query($query);

while ($row = $result->fetch_assoc()) {
    //do some stuff
}

如您所见,我将查询限制为 6 行,但在某些情况下,返回的行数会更少。如果只返回 3 行,我想扔掉最后一行,只保留 2 行。

如何在 MySQL 查询或 MySQLi 中执行此操作?

【问题讨论】:

    标签: php sql mysql mysqli limit


    【解决方案1】:

    我会想象这样的事情:

    // row counter
    $counter = 1;
    // loop through each row
    while($row = $result->fetch_assoc()) {
        // If there is more than one row remaining 
        // OR if the current row can be divided by two
        if (($result->num_rows - $counter) > 1 || ($counter % 2)) {
            // result code for even rows
            $counter++;
        } else {
            // break out of the loop
            break;
        }
    }
    

    【讨论】:

    • 你不能直接弹出最后一个吗?我刚查了一下,PHP有一个函数“array_pop”。我不是 PHP 程序员,但我想一定有一个长度函数和一个模运算符。
    【解决方案2】:

    我可能会在 PHP 中而不是 SQL 中执行此操作。在while-循环中,保留一个计数器,当你退出循环时,检查计数器是否。如果很奇怪,就把上次迭代的结果扔掉。

    【讨论】:

      【解决方案3】:

      另一种选择是要求COUNT 并根据结果更改查询:

      SELECT COUNT(*) FROM movies WHERE publish = 1 AND showimage = 1

      【讨论】:

        【解决方案4】:

        我不是 PHP 人(我已经有好几年没看过它了)但是....

        Ross 提到过,但你想用

        $result->num_rows
        

        在您的循环中以某种方式处理结果以保持偶数行。

        【讨论】:

          【解决方案5】:
          $maxResults = $result->num_rows;
          if( ($maxResults % 2) = 1)
              $maxResults--;
          

          当计数器与$maxResults相同时,跳出循环。

          【讨论】:

            【解决方案6】:

            我的答案只是 mysql,虽然可能不是最好的,但也许有点酷。 :-)

            SELECT size INTO @count FROM (SELECT COUNT(*) as size FROM (SELECT * FROM table LIMIT 6) l) t;
            SET @count = @count - (@count % 2);
            PREPARE stmt_limit FROM 'SELECT * FROM table LIMIT ?';
            EXECUTE stmt_limit USING @count;
            DEALLOCATE PREPARE stmt_limit;
            

            步骤:

            1. 在第一条语句中,我将您真正得到的结果数放入了@count 变量中
            2. 在第二个语句中,如果变量不均匀,我将变量减一
            3. 使用您的查询和占位符为限制准备语句
            4. 执行婴儿
            5. 解除分配,不知道有没有必要

            但谁知道呢,这可能比 php 解决方案更快...

            【讨论】:

              【解决方案7】:

              最简单的方法是一次抓取两行:

              while($row1 = $result->fetch_assoc() && $row2 = $result->fetch_assoc()) {
                  do_something_with($row1);
                  do_something_with($row2);
              }
              

              (不是 PHP 人,而是从其他答案中学习语法...)

              【讨论】:

                【解决方案8】:

                夏基,

                您的解决方案将完美运行,但您需要稍微修改语法。见下文。

                while(($row1 = $result->fetch_assoc()) && ($row2 = $result->fetch_assoc()))
                { 
                    do_something_with($row1); 
                    do_something_with($row2); 
                } 
                

                您的第二行将取消第一行并且不会显示第一行的另一种方式。现在它将显示两个结果。不错的简单解决方案,顺便说一句。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2015-03-29
                  • 2015-01-19
                  • 2011-03-24
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-05-07
                  • 1970-01-01
                  • 2014-05-12
                  相关资源
                  最近更新 更多