做实验的表:
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)