【问题标题】:Get count query results with ignoring the LIMIT statement忽略 LIMIT 语句获取计数查询结果
【发布时间】:2014-03-25 07:45:19
【问题描述】:

我有一个简单的查询如下:

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

现在进行分页,我需要在查询中添加LIMIT,所以:

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

我仍然想知道mysql_num_rows 的所有行数,但在上面的查询中它总是 10,因为我限制了结果,所以对于我需要做的所有行数在没有LIMIT 语句的情况下再次执行相同的查询。

为了得到所有行的数量而运行两次相同的查询有点愚蠢,有人有更好的解决方案吗?

谢谢

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    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,并且实际的 COUNTing 可能与简单的 SELECT COUNT(*)... 的速度相似。我自己会倾向于坚持标准的做法。

    【讨论】:

    • 我真正的查询是这样的:SELECT members.username, stock.id FROM members JOIN stock ON members.id = stock.user_owner LIMIT 10,我应该把SQL_CALC_FOUND_ROWS放在这个查询的什么地方?
    • 紧跟在SELECT之后:SELECT SQL_CALC_FOUND_ROWS members.username, stock.id ...
    • 对于那些正在阅读本文的人,要获得计数,您在查询后需要这个:$count = mysql_query("SELECT FOUND_ROWS()"); $count = mysql_result($count , 0); echo $count;
    • 我不知道为什么,但对我来说 FOUND_ROWS() 返回1。没有其他的。 SELECT SQL_CALC_FOUND_ROWS log.suma, ...blabla... FROM log INNER JOIN kategorie ON log.id_kategorie = kategorie.id WHERE ( kategorie.kategoria LIKE "%a%" ) ORDER BY id DESC LIMIT 0, 7; SELECT FOUND_ROWS() as pocet
    【解决方案2】:

    如果你想知道总的结果,你需要两个查询,但是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
    

    【讨论】:

      【解决方案3】:

      对于分页,您必须先运行计数查询才能获得总数。

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

      两个查询是必要的

      【讨论】:

      • 这又在运行 2 个查询,对吧?一个用于真实结果,一个用于计数
      • @behz4d 是的,正如我所说,需要 2 个查询。
      • 好像不是,https://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows
      【解决方案4】:
      $total = "SELECT count(*) FROM blah WHERE disabled = '0'";
      
      if($total > 0)
      {
          $q = "SELECT * FROM blah WHERE disabled = '0' LIMIT 0,10";
      }
      

      最好包含一个分页类并动态调用 LIMIT 和 OFFSET。

      【讨论】:

      • 如果你愿意,我会分享你的分页脚本。
      【解决方案5】:

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

      首先,如果您知道您的数据没有缓存总行数 改变很多 - 不是一个很好的解决方案,至少我不喜欢它。

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

      如果您没有大量数据,SQL_CALC_FOUND_ROWS 将是一个很好的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-12
        • 1970-01-01
        • 2016-04-19
        • 1970-01-01
        • 1970-01-01
        • 2013-10-07
        相关资源
        最近更新 更多