如何在MYSQL中的单个查询中计算和限制记录?

Pra*_*ant 17 php mysql count

我在表中搜索记录如下:

SELECT Id, Name FROM my_table WHERE Name LIKE '%prashant%' LIMIT 0, 10;
Run Code Online (Sandbox Code Playgroud)

现在,我正在添加LIMIT来维护我的分页.但是当用户搜索单词'prashant'时,我的总记录为'prashant'为124.但是,由于限制应用于查询,因此它只在我的PHP脚本中获取10条记录,当我在PHP代码中计算mysql变量时,它返回的总记录数为10.

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

谢谢.

Ion*_*tan 18

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

# Find total rows
SELECT FOUND_ROWS();
Run Code Online (Sandbox Code Playgroud)

更多信息

  • MySQL永远不会在广告部门惊叹不已. (4认同)
  • 这是一个不太有价值的扩展,支持在网页上进行分页,而且很明显,在阅读MySQL文档时,它在添加之前并没有经过深思熟虑.它的表现很差.简而言之,这是一个黑客. (4认同)

Emi*_*l H 10

MySQL支持使用SQL_CALC_FOUND_ROWSIonut提到的这样做.然而,事实证明,在许多情况下,使用两种语句以旧式方式执行它实际上更快,其中一种是常规语句count().然而,这确实需要使用索引扫描来完成计数,这不是这个查询的情况,但我认为无论如何我都会提到它.


inh*_*han 6

这是针对具有相同需求的其他人(考虑到这个问题已经过了3年).

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

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
Run Code Online (Sandbox Code Playgroud)

所以结果是这样的

| id  |      name      | total |
+-----+----------------+-------+
|  1  | Jason Prashant |  124  |
|  2  | Bob Prashant   |  124  |
|  3  | Sam Prashant   |  124  |
|  4  | etc. prashant  |  124  |
Run Code Online (Sandbox Code Playgroud)

我认为这个解决方案在计时方面没有任何缺点,因为它只获取一次结果,然后使用已经计算的附加列的行数.