好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

mysql 获取记录总行数 当有group by等存时候总记录

src="/js/s2.js">

当有group by等存在的时候sum(*)获取不了的解决方案
做实验的表:

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等存时候总记录的详细内容...

  阅读:37次