我有一个简单的查询如下:
$q = "SELECT * FROM blah WHERE disabled = '0'";
现在为了分页,我需要在查询中添加LIMIT
,所以:
$q = "SELECT * FROM blah WHERE disabled = '0' LIMIT 10,20";
仍然,我想知道mysql_num_rows
所有行的数量,但在上面的查询中它总是10,因为我限制了结果,所以对于我需要的所有行的数量在没有LIMIT
语句的情况下再次执行相同的查询。
以某种方式运行相同的查询两次以获取所有行的数量是不是很愚蠢,任何人都有更好的解决方案?
由于
答案 0 :(得分:10)
MySQL supports a FOUND_ROWS()
function查找从上一个有限查询返回的无限数量的行。
SELECT SQL_CALC_FOUND_ROWS * FROM blah WHERE disabled = '0' LIMIT 10,20
SELECT FOUND_ROWS();
请注意:(a)您需要包含SQL_CALC_FOUND_ROWS
选项,以及(b)这是一个特定的MySQL扩展,不能在另一个RDBMS上运行(尽管它们每个可能有自己的方式这样做。)
这不一定是最好的做事方式,即使它可能是这样的;你仍然需要发布两个语句,你引入了非标准的SQL,实际的COUNT
可能与简单的SELECT COUNT(*)...
速度相似。我本人倾向于坚持标准的做法。
答案 1 :(得分:1)
如果您想知道总结果,则需要两个查询,但COUNT
忽略LIMIT
因此,您可以执行以下操作:
SELECT * FROM blah WHERE disabled = '0' LIMIT 10,20 // Give 10 rows
SELECT COUNT(*) FROM blah WHERE disabled = '0' LIMIT 10,20 // Give you a count of ALL records
答案 2 :(得分:0)
对于分页,您必须运行计数查询才能获得总计。
$q = "SELECT count(*) FROM blah WHERE disabled = '0'";
两个查询必要。
答案 3 :(得分:0)
$total = "SELECT count(*) FROM blah WHERE disabled = '0'";
if($total > 0)
{
$q = "SELECT * FROM blah WHERE disabled = '0' LIMIT 0,10";
}
包含分页类并动态调用LIMIT和OFFSET会更好。
答案 4 :(得分:0)
有几种方法可以做到这一点,
如果您知道数据没有,首先可以缓存总行数 改变很多 - 不是一个很好的解决方案,我至少不喜欢它。
其次,您可能需要查看SQL_CALC_FOUND_ROWS
,但有时COUNT(*)更快
因为第一个将扫描整个表,而count将扫描索引。由你决定
测试和使用你想要的东西。
如果您没有大量数据,SQL_CALC_FOUND_ROWS
将是一个很好的解决方案。