【问题标题】:How to count all rows when using SELECT with LIMIT in MySQL query?在 MySQL 查询中使用 SELECT 和 LIMIT 时如何计算所有行?
【发布时间】:2010-03-13 20:00:21
【问题描述】:

我有一个这样的 mysql 查询:

SELECT A.ID, A.NAME, B.ID, B.NAME
FROM table1 A
JOIN table2 B ON ( A.ID = B.TABLE1_ID )
WHERE
    cond1, cond2, ..., condN
LIMIT 10

我在查询中有很多 where 子句。 如何改进此查询以获得完整的行数? 我不想再使用一个没有 LIMIT 的请求。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    你要找的是this

    SELECT SQL_CALC_FOUND_ROWS A.ID, A.NAME, B.ID, B.NAME
    FROM table1 A
    JOIN table2 B ON ( A.ID = B.TABLE1_ID )
    WHERE
      cond1, cond2, ..., condN
    LIMIT 10
    
    SELECT FOUND_ROWS();
    

    【讨论】:

    • 谢谢!这在 mysql 监视器中工作正常。但是在 PHP 中第二个查询返回 1。如何在 PHP 中正确执行这两个查询?
    • 你安装的 PHP 版本是什么?看看这个stackoverflow.com/questions/674061/…
    • 重要提示:SQL_CALC_FOUND_ROWS 在 MySQL 8.0 中已弃用,它将在 MySQL 的下一版本中删除
    【解决方案2】:

    您可以使用SQL_CALC_FOUND_ROWS with FOUND_ROWS() 来计算执行该查询时的结果数。基本上,您只需在“SELECT”之后添加“SQL_CALC_FOUND_ROWS”,然后再运行另一个查询“SELECT FOUND_ROWS()”。无法在同一个查询中发回计数,因为在查询完成之前它无法知道计数。

    【讨论】:

      【解决方案3】:

      距离上一个答案已有 4 年了,但这就是我解决问题的方式。虽然 SaltLake 的回答对我产生了错误,但它确实引导我找到了正确的答案。

      SELECT SQL_CALC_FOUND_ROWS * FROM wholedatabase LIMIT 0,10 UNION 
      SELECT 'TotalRows', FOUND_ROWS(), NULL, NULL, NULL, NULL
      ORDER BY IssueDate, VolumeNo 
      

      UNION 部分非常重要,因为它将在 SECOND Select 结果中检索到的所需答案(总行数)标记到 FIRST Select 结果中。

      另一个非常重要的一点是,因为正在执行 UNION,所以两个表中的列数必须相同。这通常意味着您必须使用最重要的 FOUND_ROWS() 值填充 SECOND Select,然后填充大量 NULL 值。

      最终结果将是一个返回 11 行信息的命令,其中一行包含总行数。显然,当您开始使用结果时,您需要排除额外的 TotalRows 行。

      【讨论】:

        【解决方案4】:

        来自http://is.php.net/manual/en/function.mysql-num-rows.php#83647的解决方案

        SELECT SQL_CALC_FOUND_ROWS 
            '0', z.id
        FROM 
            zoom AS z 
        LIMIT 0,6 
        UNION 
          SELECT 
            '1', FOUND_ROWS() 
        ORDER BY `0` DESC , RAND()
        

        【讨论】:

          【解决方案5】:

          你应该使用

          SELECT SQL_CALC_FOUND_ROWS A.ID, A.NAME, B.ID, B.NAME, FOUND_ROWS() as rCount
          FROM table1 A
          JOIN table2 B ON ( A.ID = B.TABLE1_ID )
          WHERE
              cond1, cond2, ..., condN
          LIMIT 10
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-09-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-11
            • 1970-01-01
            相关资源
            最近更新 更多