2

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

4

8 回答 8

5

我可能会在 PHP 中执行此操作,而不是 SQL。在while-loop 中,保留一个计数器,当你退出循环时,检查计数器是否。如果它很奇怪,请丢弃最后一次迭代的结果。

于 2009-01-17T12:32:21.417 回答
5

我会想象这样的事情:

// 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;
    }
}
于 2009-01-17T12:43:47.853 回答
4

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

SELECT COUNT(*) FROM movies WHERE publish = 1 AND showimage = 1
于 2009-01-17T12:45:10.533 回答
2

我不是 PHP 人(自从我看过它以来已经有好几年了)但是....

罗斯提到它,但你想使用

$result->num_rows

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

于 2009-01-17T13:01:26.100 回答
2
$maxResults = $result->num_rows;
if( ($maxResults % 2) = 1)
    $maxResults--;

当 counter 与 相同时$maxResults,跳出循环。

于 2009-01-17T13:12:45.190 回答
1

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

于 2009-01-17T14:24:46.323 回答
1

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

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

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

于 2009-04-18T00:21:47.187 回答
1

夏基,

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

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

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

于 2010-04-05T23:13:27.740 回答