2014-03-25 37 views
6

我有一个简单的查询,如下所示:获取数查询结果与忽略LIMIT声明

$q = "SELECT * FROM blah WHERE disabled = '0'"; 

现在对于分页,我需要添加LIMIT我的查询,因此:

$q = "SELECT * FROM blah WHERE disabled = '0' LIMIT 10,20"; 

而且仍然我想知道mysql_num_rows的所有行的数量,但在上面的查询中总是10,因为我限制了结果,所以对于所有行的数量,我需要再次执行相同的查询,而不使用LIMIT声明。

而且它运行相同的查询两次以获取所有行的数量有点愚蠢,任何人都有更好的解决方案?

感谢

回答

9

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 ing可能与简单的SELECT COUNT(*)...类似。我本人倾向于坚持这样做的标准方式。

+0

这是它,ty ... – behz4d

+0

我真正的查询是这样的:'SELECT members.username,stock.id FROM members JOIN stock ON members.id = stock.user_owner LIMIT 10',where'sql_CALC_FOUND_ROWS' in in这个查询? – behz4d

+1

紧跟在SELECT之后:'SELECT SQL_CALC_FOUND_ROWS members.username,stock.id ...' –

0

对于分页,你必须运行一个查询计数第一个获得总。

$q = "SELECT count(*) FROM blah WHERE disabled = '0'"; 

两个查询必要

+0

这是再次运行2个查询,对吧?一个用于实际结果,另一个用于计数 – behz4d

+0

@ behz4d是的,正如我所说的,需要2个查询。 – xdazz

+0

它似乎不是,'https:// dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows' – behz4d

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 
0
$total = "SELECT count(*) FROM blah WHERE disabled = '0'"; 

if($total > 0) 
{ 
    $q = "SELECT * FROM blah WHERE disabled = '0' LIMIT 0,10"; 
} 

最好是包括分页类,并调用动态限制和偏移。

+0

如果你想我会分享你的分页脚本。 –

0

有几种方法可以做到这一点,

首先你可以缓存的总行,如果你知道你的数据不会改变 很多 - 不是一个很好的sollution,我不至少喜欢它。

其次,您可能想看看SQL_CALC_FOUND_ROWS但有时COUNT(*)更快 ,因为第一个扫描整个表时count将扫描索引。这取决于你 测试和使用你想要的。

如果你没有大量的数据SQL_CALC_FOUND_ROWS将是一个很好的溶剂。