mySQL count多个表的数据实例详解

一、实现需求

最近在做成就系统,成就中有很多维度都和数量有关,比如用户粉丝数达到多少50个,授予 名扬四海 称号,用户点赞达到 100 次,授予 点赞圣手 称号等等。

粉丝数在 user_relation

点赞数在 user_praise

按照以往的做法,如果需要查询用户的这些数据,又因为数据是在不同的表中,所以往往会分开多条 SQL 查询,比如:

SELECT count(*) mysh FROM user_relation WHERE other_uid =123456;
SELECT count(*) dzss FROM user_praise WHERE praise_uid = 123456;

然后将查询出的数据封装在一个对象中,返回给客户端或者另做他用,如果需要统计的表少点还可以,但是像成就系统中,往往有各种各样的成就,我们现在涉及到 12 张表,如果按照这种来查询,那么就要写 12 条 SQL 查询 12 次,这让人有点不爽。

二、能否用一条 SQL 语句实现呢

答案是肯定的

像这种将多个表不同的数据,整合在一个表中的时候,我们可以采用 UNION 操作。

首先将使用 UNION 改写以上语句:

SELECT wrzm,mysh,sgbh FROM (

 SELECT count(*) wrzm,0 mysh,0 sgbh FROM user_witness WHERE plan_uid = 123456

 UNION ALL

 SELECT 0 wrzm,count(*) mysh,0 sgbh FROM user_relation WHERE other_uid = 123456

 UNION ALL

 SELECT 0 wrzm,0 mysh,count(*) sgbh FROM plan_stage WHERE uid = 123456 AND status = 1

) t;

按照上面查询出来的结果为:


mysql_count_results

我们发现这个结果已经有点像样了,如果能将表中 wrzm ,mysh ,sgbh 的数据三行变成一行,那就好了。于是我们很自然可以想到用 SUM (当然一开始我没想到,经过朋友提醒),于是改写上面的 SQL :

SELECT sum(wrzm) wrzm,sum(mysh) mysh,sum(sgbh) sgbh FROM (

 SELECT count(*) wrzm,0 mysh,0 sgbh FROM user_witness WHERE plan_uid = 123456

 UNION ALL

 SELECT 0 wrzm,count(*) mysh,0 sgbh FROM user_relation WHERE other_uid = 123456

 UNION ALL

 SELECT 0 wrzm,0 mysh,count(*) sgbh FROM plan_stage WHERE uid = 123456 AND status = 1

) t;

然后得出的结果为:


mysql_count_result_2

至此,得到了我们想要的结果,在一条 SQL 语句中实现了多个表的 count 统计。

三、拓展

如图,我们能获取到的仅仅是一个用户的数据,但是我们需要统计的是 user_info 中的所有用户,那么也很简单,我们再次进行改写:

SELECT uid,sum(wrzm) wrzm,sum(mysh) mysh,sum(sgbh) sgbh FROM (

 SELECT plan_uid uid,count(*) wrzm,0 mysh,0 sgbh FROM user_witness
  GROUP BY plan_uid

 UNION ALL

 SELECT other_uid uid,0 wrzm,count(*) mysh,0 sgbh FROM user_relation
  GROUP BY other_uid

 UNION ALL

 SELECT uid,0 wrzm,0 mysh,count(*) sgbh FROM plan_stage WHERE status = 1
  GROUP BY uid

) t GROUP BY uid;

查询结果为:


mysql_count_results_3

在这个结果中,如果我们需要查看具体某一个用户,那么在最后加上
WHERE uid = 123456 即可,如果要排序的话,那么直接加上 ORDER BY 即可。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家在使用或者学习mysql的时候能有所帮助,如果有疑问大家可以留言交流。

(0)

相关推荐

  • mysql技巧之select count的区别分析

    1.测试环境 OS:LinuxDB:mysql-5.5.18table:innodb存储引擎 表定义如下: 2. 测试场景与分析[统计表group_message的记录数目] (1)select count(*)方式 (2)select count(1)方式 (3)select count(col_name)方式 分别使用 select count(group_id) select count(user_id) select count(col_null) 通过上述测试结果可以看到,select

  • MYSQL中统计查询结果总行数的便捷方法省去count(*)

    MYSQL的关键词 : SQL_CALC_FOUND_ROWS 查看手册后发现此关键词的作用是在查询时统计满足过滤条件后的结果的总数(不受 Limit 的限制) 例如: 复制代码 代码如下: SELECT SQL_CALC_FOUND_ROWS tid FROM cdb_threads WHERE fid=14 LIMIT 1,10; 假设满足条件的有1000条,这里返回10条. 立即使用 复制代码 代码如下: SELECT found_rows() AS rowcount; 则返回的 rowc

  • 详细解读MySQL中COUNT函数的用法

    MySQL的COUNT函数是最简单的功能,非常有用的计算,预计由一个SELECT语句返回的记录数. 要了解COUNT函数考虑的EMPLOYEE_TBL的的表具有以下记录: mysql> SELECT * FROM employee_tbl; +------+------+------------+--------------------+ | id | name | work_date | daily_typing_pages | +------+------+------------+----

  • 关于mysql innodb count(*)速度慢的解决办法

    innodb引擎在统计方面和myisam是不同的,Myisam内置了一个计数器,所以在使用 select count(*) from table 的时候,直接可以从计数器中取出数据.而innodb必须全表扫描一次方能得到总的数量.要初步解决这个问题,需要做不同于myisam的一些工作: 1.使用第二索引(一般不使用主键索引),并且添加where条件,如: 复制代码 代码如下: select count(*) from product where comp_id>=0 ; show index f

  • MySQL中distinct和count(*)的使用方法比较

    首先对于MySQL的DISTINCT的关键字的一些用法: 1.在count 不重复的记录的时候能用到,比如SELECT COUNT( DISTINCT id ) FROM tablename:就是计算talbebname表中id不同的记录有多少条. 2,在需要返回记录不同的id的具体值的时候可以用,比如SELECT DISTINCT id FROM tablename:返回talbebname表中不同的id的具体的值. 3.上面的情况2对于需要返回mysql表中2列以上的结果时会有歧义,比如SE

  • 关于mysql中innodb的count优化问题分享

    一般采用二级索引去count:比如:id 是pk aid是secondary index 采用 复制代码 代码如下: select count(*) from table where id >=0;或select count(*) from table; 效果是一样的,都是默认使用pk索引,且都要全表扫描,虽然第一种性能可能高一些,但是没有明显区别. 但是如果用secondary index 复制代码 代码如下: select count(*) from table where aid>=0;

  • MySQL里的found_row()与row_count()的解释及用法

    出处:mysqlpub.com MySQL中有两个函数来计算上一条语句影响了多少行,不同于SqlServer/Oracle,不要因为此方面的差异而引起功能问题: 1,判断Select得到的行数用found_rows()函数进行判断. 2,判断Update或Delete影响的行数用row_count()函数进行判断,这里需要注意,如果Update前后的值一样,row_count则为0,而不像SqlServer里的@@rowcount或Oracle里的rowcount,只要update到行,影响的行

  • 有关mysql中ROW_COUNT()的小例子

    注:mysql中的ROW_COUNT()可以返回前一个SQL进行UPDATE,DELETE,INSERT操作所影响的行数. MySQL上的测试(数据库版本为:5.1.22): 1.创建数据库表: 复制代码 代码如下: create table t(  id int,  name varchar(50),  address varchar(100),  primary key(id,name)  )engine =InnoDB; 2.插入测试数据: 复制代码 代码如下: insert into t

  • mysql count详解及函数实例代码

    mysql count详解 count函数是用来统计表中或数组中记录的一个函数,下面我来介绍在mysql中count函数用法. count(*) 它返回检索行的数目, 不论其是否包含 NULL值. SELECT 从一个表中检索,而不检索其它的列,并且没有 WHERE子句时, COUNT(*)被优化到最快的返回速度. 例如: mysql> SELECT COUNT(*) FROM student; COUNT(DISTINCT 字段)这个优化仅适用于 MyISAM表, 原因是这些表类型会储存一个函

  • 浅析一个MYSQL语法(在查询中使用count)的兼容性问题

    简单来说就是在查询中使用count以及更多字段 复制代码 代码如下: select count(id),id,name from table 很尴尬的,我的环境是5.5的,这个是能获取到结果的,但是运行到服务器就不行了好吧,报了一个错误 复制代码 代码如下: #1140 - Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY claus

  • Mysql中的count()与sum()区别详细介绍

    首先创建个表说明问题 复制代码 代码如下: CREATE TABLE `result` ( `name` varchar(20) default NULL, `subject` varchar(20) default NULL, `score` tinyint(4) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 插入一些数据, 复制代码 代码如下: insert into result values ('张三','数学',90), ('张三'

  • mysql_num_rows VS COUNT 效率问题分析

    mysql_num_rows 和 count( * ) 都能统计总数,那个能好一点呢? 或者 分别什么时候用num_rows 和 count( * )呢 一个直观的对比 测试数据: 条数:139764条 数据表大小:500M 结果: fetch_num_rows 用时:35.272329092026 count(*) 用时:0.071956872940063 如果单纯统计数量 当然是count(*) fetch_num_rows必须遍历数据库以后才能得出 效率低于count(*)

随机推荐