当我试图计算表中的记录数时,即使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
,一切都会完美显示......它是怎么做到的?
答案 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,必须使用。