源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2021-01-27 17:28 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:mySQL count多个表的数据实例详解
[b]一、实现需求[/b] 最近在做成就系统,成就中有很多维度都和数量有关,比如用户粉丝数达到多少50个,授予 名扬四海 称号,用户点赞达到 100 次,授予 点赞圣手 称号等等。 粉丝数在 [code]user_relation [/code]表 点赞数在 [code]user_praise [/code]表 按照以往的做法,如果需要查询用户的这些数据,又因为数据是在不同的表中,所以往往会分开多条 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 次,这让人有点不爽。 [b]二、能否用一条 SQL 语句实现呢[/b] 答案是肯定的 像这种将多个表不同的数据,整合在一个表中的时候,我们可以采用 [code]UNION [/code]操作。 首先将使用 [code]UNION [/code]改写以上语句:
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;
[b]按照上面查询出来的结果为:[/b] [img]http://files.jb51.net/file_images/article/201611/201611284159174.png?201610284211[/img] mysql_count_results 我们发现这个结果已经有点像样了,如果能将表中 [code]wrzm [/code],[code]mysh [/code],[code]sgbh [/code]的数据三行变成一行,那就好了。于是我们很自然可以想到用 [code]SUM [/code](当然一开始我没想到,经过朋友提醒),于是改写上面的 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;
[b]然后得出的结果为:[/b] [img]http://files.jb51.net/file_images/article/201611/201611284241260.png?201610284249[/img] mysql_count_result_2 至此,得到了我们想要的结果,在一条 SQL 语句中实现了多个表的 [code]count [/code]统计。 [b]三、拓展[/b] 如图,我们能获取到的仅仅是一个用户的数据,但是我们需要统计的是 [code]user_info [/code]中的所有用户,那么也很简单,我们再次进行改写:
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;
[b]查询结果为:[/b] [img]http://files.jb51.net/file_images/article/201611/201611284334020.png?201610284342[/img] mysql_count_results_3 在这个结果中,如果我们需要查看具体某一个用户,那么在最后加上 [code]WHERE uid = 123456 [/code]即可,如果要排序的话,那么直接加上 [code]ORDER BY[/code] 即可。 [b]总结[/b] 以上就是这篇文章的全部内容了,希望本文的内容对大家在使用或者学习mysql的时候能有所帮助,如果有疑问大家可以留言交流。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部