使用LIMIT计算MySQL记录

时间:2011-02-07 19:24:08

标签: php mysql count while-loop

当我试图计算表中的记录数时,即使SQL语句中有LIMIT,它总体上起作用,但是有些奇怪的事情发生了,代码:

$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

如果我删除了COUNT(*) AS count,一切都会完美显示......它是怎么做到的?

9 个答案:

答案 0 :(得分:15)

不要使用COUNT(*)来计算行数(出于很多原因)。写出完整的查询,然后在SELECT之后添加SQL_CALC_FOUND_ROWS

SELECT SQL_CALC_FOUND_ROWS id, title FROM foo LIMIT 5;

然后,在执行该查询后(紧接其后),运行:

SELECT FOUND_ROWS();

如果你最后没有SELECT(占所有连接和where子句),那将返回原始LIMIT返回的行数。

它不便携,但效率很高(而恕我直言,这是解决此类问题的正确方法)。

答案 1 :(得分:1)

LIMIT在这里没有做任何事情,因为你选择了一个标量。显示错误是因为您没有选择帖子标题,因此它不在$row哈希值中。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

1)获取表的行数

$sql = "SELECT COUNT(*) AS count FROM posts;

2)获取最后5行表格

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

答案 4 :(得分:0)

您要求SELECT语句仅返回COUNT(*) AS count。如果要返回更多列,则必须在SELECT语句中指定它们。

答案 5 :(得分:0)

通过添加COUNT(*) AS count,您已删除了要从中获取信息的实际列。尝试使用

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

该查询将完成您在一个查询中尝试执行的操作,但实际上,这些应分为两个单独的查询。在查询中使用COUNT的总体目的是什么?它应该以不同的方式完成。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

我遇到了同样的问题并发现了这篇文章:http://www.mysqldiary.com/limited-select-count/ 最好的方法(特别是对于大桌子)使用它是这样的:

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

现在它返回0到5之间的数字

答案 8 :(得分:0)

这对我有用:

$sql = "
     SELECT COUNT( po.id ) AS count, p.post_title
     FROM posts p
     JOIN posts po
     GROUP BY p.post_title
     ORDER BY p.post_date DESC
     LIMIT 5
";

重要的是加入同一个表,但表的名称不同。不要忘记 GROUP BY,必须使用。