当前位置:数据库 > MySQL >>

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

当有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)

根据需要需改下面函数放到自己的程序里面:

  1. function mail_list_sent($uid$start)  
  2. {  
  3.                // 注意SQL_CALC_FOUND_ROWS uid之间没有逗号  
  4.     $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;  
  5.     $mails = $this->db->fetch_all($query);  
  6.                //查询SELECT中满足条件的行数,与LIMIT子句无关  
  7.     $max_count = $this->db->fetch_first("SELECT found_rows() AS rowcount");  
  8.               
  9.     $tmp['state_code'] = 200;  
  10.     $tmp['info'] = "OK";          
  11.     $tmp['list'] = $mails;  
  12.     $data = json_encode($tmp);  
  13.     return $data;             
  14. }  
Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,