mysql中calculate_MySQL中SQL_CALC_FOUND_ROWS的用法

1. SQL_CALC_FOUND_ROWS简述

在很多分页的程序中都这样写:

#查出符合条件的记录总数

SELECT COUNT(*) from [table] WHERE ......;

#查询当页要显示的数据

SELECT * FROM [table] WHERE ...... limit M,N;

但是从Mysql4.0.0开始,我们可以选择使用另外一个方式:

SELECT SQL_CALC_FOUND_ROWS * FROM [table] WHERE ...... limit M, N;

SELECT FOUND_ROWS();

#SQL_CALC_FOUND_ROWS 告诉MySQL将sql所处理的行数记录下来

#FOUND_ROWS() 则取到了这个纪录。

虽然也是两个语句,但是只执行了一次主查询,所以效率比原来要高很多。

2.SQL_CALC_FOUND_ROWS FOUND_ROWS()文档中英对照

FOUND_ROWS()

A SELECT statement may include a LIMIT clause to restrict the number of rows the server returns

to the client. In some cases, it is desirable to know how many rows the statement would have

returned without the LIMIT, but without running the statement again. To obtain this row count,

include a SQL_CALC_FOUND_ROWS option in the SELECT statement, and then invoke FOUND_ROWS() afterward:

SELECT语句中经常可能用LIMIT限制返回行数。有时候可能想要知道如果没有LIMIT会返回多少行,但又不想再执行一次相同

语句。那么,在SELECT查询中包含SQL_CALC_FOUND_ROWS选项,然后执行FOUND_ROWS()就可以了:

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;

mysql> SELECT FOUND_ROWS();

The second SELECT returns a number indicating how many rows the first SELECT would have returned

had it been written without the LIMIT clause.

第二个SELECT将返回第一条SELECT如果没有LIMIT时返回的行数。

In the absence of the SQL_CALC_FOUND_ROWS option in the most recent SELECT statement,

FOUND_ROWS() returns the number of rows in the result set returned by that statement.

如果在前一条语句中没有使用SQL_CALC_FOUND_ROWS选项,FOUND_ROWS()将返回前一条语句实际返回的行数。

The row count available through FOUND_ROWS() is transient and not intended to be available

past the statement following the SELECT SQL_CALC_FOUND_ROWS statement. If you need to

refer to the value later, save it:

FOUND_ROWS()得到的数字是临时的,执行下一条语句就会失效。如果想要这个数字,就要将它保存下来:

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM ... ;

mysql> SET @rows = FOUND_ROWS();

If you are using SELECT SQL_CALC_FOUND_ROWS, mysql must calculate how many rows are in the full

result set. However, this is faster than running the query again without LIMIT, because the

result set need not be sent to the client.

如果使用 SELECT SQL_CALC_FOUND_ROWS,MySQL必须计算所有结果集的行数。尽管这样,总比再执行一次不使用LIMIT

的查询要快多了,因为结果集不需要返回客户端。

SQL_CALC_FOUND_ROWS and FOUND_ROWS() can be useful in situations when you want to restrict the

number of rows that a query returns, but also determine the number of rows in the full result

set without running the query again.

当你想要限制查询的返回行数的同时又想得到查询的完整结果集合的行数,但又不想重复执行一次查询,那么

SQL_CALC_FOUND_ROWS and FOUND_ROWS() 是非常有用的!

3.UNION 语句下的用法

3.1 SQL_CALC_FOUND_ROWS只能出现在UNION的第一个SELECT中,否则编译报错!

mysql> (select SQL_CALC_FOUND_ROWS * from actor limit 1) union (select SQL_CALC_FOUND_ROWS * from actor limit 1);

ERROR 1234 (42000): Incorrect usage/placement of 'SQL_CALC_FOUND_ROWS'

3.2 limit中 select 中的情况

#union all

mysql> (select SQL_CALC_FOUND_ROWS * from actor limit 1) union all (select * from actor limit 1);

+----------+------------+-----------+---------------------+

| actor_id | first_name | last_name | last_update |

+----------+------------+-----------+---------------------+

| 1 | PENELOPE | GUINESS | 2006-02-15 04:34:33 |

| 1 | PENELOPE | GUINESS | 2006-02-15 04:34:33 |

+----------+------------+-----------+---------------------+

2 rows in set (0.00 sec)

mysql> select FOUND_ROWS();

+--------------+

| FOUND_ROWS() |

+--------------+

| 2 |

+--------------+

1 row in set (0.00 sec)

union

mysql> (select SQL_CALC_FOUND_ROWS * from actor limit 1) union (select * from actor limit 1);

+----------+------------+-----------+---------------------+

| actor_id | first_name | last_name | last_update |

+----------+------------+-----------+---------------------+

| 1 | PENELOPE | GUINESS | 2006-02-15 04:34:33 |

+----------+------------+-----------+---------------------+

1 row in set (0.00 sec)

mysql> select FOUND_ROWS();

+--------------+

| FOUND_ROWS() |

+--------------+

| 1 |

+--------------+

1 row in set (0.00 sec)

可以看到,limit中 select 中时,FOUND_ROWS()返回的时显示的行数!

3.2 limit中 UNION 外的情况

mysql> (select SQL_CALC_FOUND_ROWS * from actor ) union (select * from actor ) order by actor_id limit 2 ;

+----------+------------+-----------+---------------------+

| actor_id | first_name | last_name | last_update |

+----------+------------+-----------+---------------------+

| 1 | PENELOPE | GUINESS | 2006-02-15 04:34:33 |

| 2 | NICK | WAHLBERG | 2006-02-15 04:34:33 |

+----------+------------+-----------+---------------------+

2 rows in set (0.00 sec)

mysql> select FOUND_ROWS();

+--------------+

| FOUND_ROWS() |

+--------------+

| 200 |

+--------------+

1 row in set (0.00 sec)

mysql> (select SQL_CALC_FOUND_ROWS * from actor ) union all (select * from actor ) order by actor_id limit 2 ;

+----------+------------+-----------+---------------------+

| actor_id | first_name | last_name | last_update |

+----------+------------+-----------+---------------------+

| 1 | PENELOPE | GUINESS | 2006-02-15 04:34:33 |

| 1 | PENELOPE | GUINESS | 2006-02-15 04:34:33 |

+----------+------------+-----------+---------------------+

2 rows in set (0.01 sec)

mysql> select FOUND_ROWS();

+--------------+

| FOUND_ROWS() |

+--------------+

| 400 |

+--------------+

1 row in set (0.00 sec)

可以看到,limit中 UNION 外时,FOUND_ROWS()返回的所有的行数! UNION ALL 会返回2倍的行数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值