做实验的表:
MariaDB [test]> select * from prefix_user;
+---------+-----------+-----+-------+
| user_id | username | age | email |
+---------+-----------+-----+-------+
| 2 | username2 | 2 | NULL |
| 3 | username3 | 111 | 1 |
| 4 | username3 | 10 | 1 |
| 5 | username3 | 10 | NULL |
| 6 | username3 | 10 | NULL |
+---------+-----------+-----+-------+
5 rows in set (0.01 sec)
一般情况:
直接用count() 函数
select count(*) from 表 where 条件;
或者
select count(主键) from 表 where 条件;
其中主键和*的区别主要是: * 会统计 null 的行,
select count(*) from prefix_user where 1; // 5行
select count(email) from prefix_user ;// 2行,忽略了值为null的
当和group by 混用的时候, count() 函数返回的结果是group by之后的结果,例如
MariaDB [test]> select count(*) from prefix_user group by age;
+----------+
| count(*) |
+----------+
| 1 |
| 3 |
| 1 |
+----------+
3 rows in set (0.01 sec)
如果我们想获取总共有多少个年龄不同的行数,有两种解决方案,
第一种, 使用子语句
select count(*) from ( select count(*) from prefix_user group by age) as a;// 结果为3
第二种, 使用 FOUND_ROWS 函数, 这个函数返回的结果是上一个查询去掉limit 限制的行数,( 有文章说 如果上一个查询含有 SQL_CALC_FOUND_ROWS 和没有 SQL_CALC_FOUND_ROWS 关键字在有limit的时候返回的结果可能不一样, 但是我做实验重现不了,希望读者知道理由可以留言)
// 不使用 SQL_CALC_FOUND_ROWS
MariaDB [test]> select count(*) from prefix_user group by age limit 2;
+----------+
| count(*) |
+----------+
| 1 |
| 3 |
+----------+
2 rows in set (0.00 sec)
MariaDB [test]> SELECT FOUND_ROWS();
+--------------+
| FOUND_ROWS() |
+--------------+
| 3 |
+--------------+
1 row in set (0.00 sec)
// 使用 SQL_CALC_FOUND_ROWS 关键字
MariaDB [test]> select SQL_CALC_FOUND_ROWS count(*) from prefix_user group by age limit 2;
+----------+
| count(*) |
+----------+
| 1 |
| 3 |
+----------+
2 rows in set (0.00 sec)
MariaDB [test]> SELECT FOUND_ROWS();
+--------------+
| FOUND_ROWS() |
+--------------+
| 3 |
+--------------+
1 row in set (0.00 sec)
根据需要需改下面函数放到自己的程序里面:
function mail_list_sent( $uid , $start ) { // 注意SQL_CALC_FOUND_ROWS uid之间没有逗号 $query = "SELECT SQL_CALC_FOUND_ROWS uid, real_name, current_city, msg_uid, sender_flag, msg_title, msg_content FROM " .TT_DBTABLEPRE. "mailbox as mb1, " .TT_DBTABLEPRE. "user as usr1 WHERE mb1.sender_id=usr1.uid AND mb1.sender_id=$uid AND sender_flag > 0 LIMIT $start, " .TT_PAGESIZE; $mails = $this ->db->fetch_all( $query ); //查询SELECT中满足条件的行数,与LIMIT子句无关 $max_count = $this ->db->fetch_first( "SELECT found_rows() AS rowcount" ); $tmp [ 'state_code' ] = 200; $tmp [ 'info' ] = "OK" ; $tmp [ 'list' ] = $mails ; $data = json_encode( $tmp ); return $data ; }查看更多关于mysql 获取记录总行数 当有group by等存时候总记录的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did253509