18

我正在搜索表中的记录,如下所示:

SELECT Id, Name FROM my_table WHERE Name LIKE '%prashant%' LIMIT 0, 10;

现在,我添加 LIMIT 来维护我的分页。但是当用户搜索“prashant”这个词时,我拥有的“prashant”的总记录是 124 条。但是由于对查询的限制,所以它只在我的 PHP 脚本中获取 10 条记录,当我计算 PHP 代码中的 mysql 变量时,它返回的总记录数是 10。

所以基本上我想使用单个查询来计算和限制,通过在上面的查询中进行一些修改,我想要记录的总数(124)。我不想运行单独的 count(*) 查询来计算查询找到的总结果。

谢谢。

4

5 回答 5

19
SELECT SQL_CALC_FOUND_ROWS
  Id, Name
FROM my_table
WHERE
  Name LIKE '%prashant%'
LIMIT 0, 10;

# Find total rows
SELECT FOUND_ROWS();

更多信息

于 2009-04-29T13:35:37.720 回答
10

SQL_CALC_FOUND_ROWSMySQL 支持使用Ionut 提到的执行此操作。然而,事实证明,在许多情况下,使用两个语句(其中一个是常规的count(). 然而,这确实要求可以使用索引扫描来完成计数,对于这个查询来说,情况并非如此,但我想我还是会提到它。

于 2009-04-29T13:38:29.583 回答
6

这是为其他有同样需要的人准备的(考虑到这个问题已经过去了 3 年)。

我有一个类似的问题,我不想创建 2 个查询。所以我所做的是为总数创建一个额外的列,并在最后移动LIMITandOFFSET子句:

SELECT SQL_CALC_FOUND_ROWS * FROM (
    SELECT `id`, `name`
    FROM `my_table`
    WHERE `name` LIKE '%prashant%'
) res,
(SELECT /*CEIL(FOUND_ROWS()/10) AS 'pages',*/ FOUND_ROWS() AS 'total') tot
LIMIT 0, 10

所以结果是这样的

| id  |      name      | total |
+-----+----------------+-------+
|  1  | Jason Prashant |  124  |
|  2  | Bob Prashant   |  124  |
|  3  | Sam Prashant   |  124  |
|  4  | etc. prashant  |  124  |

我认为这个解决方案在时间上没有缺点,因为它只获取一次结果,然后将已经计算的行数用于附加列。

于 2012-08-05T22:39:04.787 回答
2

如果表很大并选择多个字段(不仅仅是您的示例中的 ID、名称),我建议使用 2 个查询。首先使用所有这些 WHERE 子句选择 count(0),然后才构建分页、选择数据等。例如,它在一些流行的电子商务网站上会运行得更快。

于 2011-02-07T12:43:50.433 回答
0

不要使用 SQL_CALC_FOUND_ROWS 和 FOUND_ROWS()

  1. 这里报告了错误
    : https://bugs.mysql.com/bug.php?id=18454 和这里:https : //bugs.mysql.com/bug.php?id=19553

  2. 而在小表上,BENCHMARK 更多地依赖于其他事物,因此您的 SELECT 所花费的时间将与 COUNT(0) 大致相同 - SQL_CALC_FOUND_ROWS 仍然限制 LIMIT 和 ORDER BY 数据库优化,因此如果您依赖它们,请不要使用SQL_CALC_FOUND_ROWS

  3. 在大型表上,BENCHMARK 差异变得很大,其中 COUNT(0) 可能需要 0.003 秒相同的 SQL_CALC_FOUND_ROWS 现在可能需要 20 秒

从所有指标来看,COUNT(0) 是最佳选择

计数(0) 语法:

(SELECT COUNT(0) FROM tableNames WHERE condition) AS alias
// alias is optional but needed if you need to use the result later

所以你的总查询看起来像这样

(SELECT COUNT(0) FROM my_table WHERE name LIKE '%prashant%') AS countResults;

SELECT Id, Name FROM my_table WHERE Name LIKE '%prashant%' LIMIT 0, 10;

然后只需在其他地方需要它的任何地方调用 countResults ......

使用 COUNT(0) 的另一个优点是您可以使用它来搜索与此处相同的表,也可以使用它来搜索不同的表...

因此,例如,如果找到的每个人也分别有 3、2、1、5 个不同的工作......你可以添加一个

(SELECT COUNT(0) FROM my_jobs_table WHERE name = name_row_in_jobs_table) AS jobs

像这样在你原来的 SELECT 里面

SELECT Id, Name (SELECT COUNT(0) FROM my_jobs_table WHERE name = name_row_in_jobs_table) AS jobs FROM my_table WHERE Name LIKE '%prashant%' LIMIT 0, 10;

给你:

--------------------
| id | Name | jobs |
--------------------
| 1  | Alice| 3    |
--------------------
| 2  | John | 2    |
--------------------
| 3  | Bob  | 1    |
--------------------
| 4  | Jill | 5    |
--------------------

因此,当显示 name[3](即 Bob)时,您还可以通过调用 jobs[3] 来显示 Bob 有 1 份工作...

于 2017-12-13T03:35:27.380 回答