Php 有限制地计算MySQL记录

Php 有限制地计算MySQL记录,php,mysql,count,while-loop,Php,Mysql,Count,While Loop,当我试图计算一个表中的记录数时,即使SQL语句中有一个限制,总的来说还是可以工作的,但是发生了一些奇怪的事情,代码: $sql = "SELECT COUNT(*) AS count FROM posts ORDER BY post_date DESC LIMIT 5"; // ... mysql_query, etc while($row = mysql_fetch_array($result)) { // ... HTML elements, et

当我试图计算一个表中的记录数时,即使SQL语句中有一个
限制
,总的来说还是可以工作的,但是发生了一些奇怪的事情,代码:

$sql = "SELECT COUNT(*) AS count FROM posts
        ORDER BY post_date DESC
        LIMIT 5";

// ... mysql_query, etc

while($row = mysql_fetch_array($result))
{
    // ... HTML elements, etc
    echo $row['post_title'];

    // ... HTML elements, etc

    echo $row['count']; // this displays the number of posts (which shows "12").
}
尽管如此,当通过
while
循环显示时,它会显示以下内容:

注意:未定义索引:第55行/Applications/MAMP/htdocs/blog/index.php中的post_title


如果我将
计数(*)作为计数删除
,所有内容都将完美显示。。。它为什么会这样做?

您要求
SELECT
语句只返回
COUNT(*)作为COUNT
。如果希望返回更多列,则必须在
SELECT
语句中指定它们。

LIMIT
在这里不起任何作用,因为您选择的是单个标量。显示错误是因为您没有选择文章标题,因此它不在
$行
哈希中。

通过将
计数(*)包含为计数
您已经删除了要从中获取信息的实际列。试用

SELECT *, COUNT(*) AS count FROM posts ORDER BY post_date DESC LIMIT 5

该查询将在一个查询中完成您试图完成的两项任务,但实际上,这些任务应该分为两个单独的查询。在查询中进行计数的总体目的是什么?它应该以不同的方式完成。

发生这种情况是因为
COUNT()
是一个聚合函数。您必须执行两个单独的查询,才能获得表中的行数和单独的记录。

您将聚合函数
count()
与标准选择混为一谈。如果聚合查询中没有GROUPBY子句,则无法获得准确的文章标题。你应该做的最简单的事情就是做这两个查询——一个查询你的计数,另一个查询你的帖子信息。另外,对聚合函数使用
LIMIT
没有任何意义,因为(省略的)
GROUP BY
中没有其他列-当前查询将始终返回一行。

不要使用
COUNT(*)
来计算行数(出于许多原因)。写出完整的查询,并在
选择之后添加:

SELECT SQL_CALC_FOUND_ROWS id, title FROM foo LIMIT 5;
然后,在执行该查询之后(紧接着),运行:

这将返回原始
SELECT
如果末尾没有
LIMIT
将返回的行数(考虑所有联接和where子句)


它不可移植,但非常高效(这是处理此类问题的正确方法)。

每个人都想说的是,您应该选择使用两个单独的查询,而不是一个单独的查询。

1) 获取表的行计数

$sql = "SELECT COUNT(*) AS count FROM posts;
2) 获取表的最后5行

$sql = "SELECT * FROM posts
        ORDER BY post_date DESC
        LIMIT 5";

我也遇到了同样的问题,发现了这篇文章: 最好的方法(特别是对于大桌子)是这样使用它:

SELECT COUNT(*) AS count FROM (SELECT 1 FROM posts
    ORDER BY post_date DESC
    LIMIT 5) t

现在它返回一个介于0和5之间的数字

为什么要限制一个只返回1个结果的select查询呢在大多数情况下都适合你。我猜你没有正确阅读…我猜你没有正确写作。我说有12条记录,我几乎没说它会返回1个结果。实际上这不是一个好答案。您将得到一个混乱的信息组合——表中的行总数与每行的值相同。你应该在两个查询中完成这项工作。@Mike(和另一个投票否决这个答案的人):Mitch并不建议你做
SELECT*,COUNT(*)
,他只是想在一个查询中说明OP想要做什么,而不是在两个查询中,这当然更有意义。米奇在回答的最后说了这一点+1米奇。我想如果你想学究气,这就回答了OP的问题,但显然“最好”的答案应该是回答问题并引导OP做“正确”的事情的答案@米奇实际上并没有给出一个“更简单”的方法,而其他帖子则给出了(@ircmaxell,@nalroff)。I-1这个和+1“最佳”答案鼓励OP在做正确的事情时三思而后行(希望OP以后能更多地了解聚合函数),在OP的情况下,这样做将表示相同的表行数作为5行的列值。没有结果集分组是没有意义的。应该是两个查询。一个是计数,一个是数据。简单易用。(注意:不可移植意味着你不能在其他数据库上使用它。请参阅@JohnB的答案,了解如何在几乎任何关系数据库上使用它)@Mike:true。但是应该注意的是,
count(*)
方法的效率明显较低(在复杂的查询中,这将花费很长时间)。如果需要支持多个数据库,这是唯一的方法。但是,如果您只使用MySQL,您应该真正使用这个…Hi ircmaxell,我只是想知道如何运行
SELECT FOUND_ROWS()使用PHP?您是否必须用它重新执行一个新的查询?(我正在使用PDO)。非常感谢:根据,从MySQL 8.0.17开始,这些函数都不推荐使用。他们建议
执行有限制的查询,然后执行第二个有COUNT(*)且无限制的查询,以确定是否有其他行。
@ircmaxell是我的英雄!
SELECT COUNT(*) AS count FROM (SELECT 1 FROM posts
    ORDER BY post_date DESC
    LIMIT 5) t