我有一些 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 中执行此操作?

有帮助吗?

解决方案

我想像这样的:

// 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中,而不是SQL。在while环,保留一个计数器,当你走出循环,检查柜台。如果是奇数,扔掉了最后一次迭代的结果。

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

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

我不是一个PHP的人(其已经有好几年,我看着它),但....

罗斯提到它,但你想使用

$result->num_rows

在循环内的一些方式,其处理结果保持的偶数行的。

$的maxResults = $ result-> NUM_ROWS; 如果(($的maxResults%2)= 1) $的maxResults - ;

当计数器是相同的maxResults $,中断循环的。

我的答案只是 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 解决方案更快......

的最简单的方法是只获取在时间的行中的两个:

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

(不是PHP的人,但货物culting从其他的答案的语法...)

夏基,

您的解决方案将很好地工作,但你需要修改语法一点。见下文。

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

你的第二个行会抵消第一行,不会显示第一的另一种方法。现在,它会显示两个结果。尼斯简单的解决方案,顺便说一句。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top