将 MySQL 查询限制为偶数个结果
题
我有一些 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;
脚步:
- 在第一个语句中,我将您真正获得的结果数量放入@count变量中
- 在第二个语句中,如果变量不均匀,我将变量减一
- 使用您的查询和限制占位符准备语句
- 处决婴儿
- 取消分配,不知道是否有必要
但谁知道,这可能比 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);
}
你的第二个行会抵消第一行,不会显示第一的另一种方法。现在,它会显示两个结果。尼斯简单的解决方案,顺便说一句。
不隶属于 StackOverflow