mySQL count多個(gè)表的數(shù)據(jù)實(shí)例詳解
一、實(shí)現(xiàn)需求
最近在做成就系統(tǒng),成就中有很多維度都和數(shù)量有關(guān),比如用戶粉絲數(shù)達(dá)到多少50個(gè),授予 名揚(yáng)四海 稱號(hào),用戶點(diǎn)贊達(dá)到 100 次,授予 點(diǎn)贊圣手 稱號(hào)等等。
粉絲數(shù)在 user_relation
表
點(diǎn)贊數(shù)在 user_praise
表
按照以往的做法,如果需要查詢用戶的這些數(shù)據(jù),又因?yàn)閿?shù)據(jù)是在不同的表中,所以往往會(huì)分開多條 SQL 查詢,比如:
SELECT count(*) mysh FROM user_relation WHERE other_uid =123456;
SELECT count(*) dzss FROM user_praise WHERE praise_uid = 123456;
然后將查詢出的數(shù)據(jù)封裝在一個(gè)對(duì)象中,返回給客戶端或者另做他用,如果需要統(tǒng)計(jì)的表少點(diǎn)還可以,但是像成就系統(tǒng)中,往往有各種各樣的成就,我們現(xiàn)在涉及到 12 張表,如果按照這種來查詢,那么就要寫 12 條 SQL 查詢 12 次,這讓人有點(diǎn)不爽。
二、能否用一條 SQL 語句實(shí)現(xiàn)呢
答案是肯定的
像這種將多個(gè)表不同的數(shù)據(jù),整合在一個(gè)表中的時(shí)候,我們可以采用 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;
按照上面查詢出來的結(jié)果為:
mysql_count_results
我們發(fā)現(xiàn)這個(gè)結(jié)果已經(jīng)有點(diǎn)像樣了,如果能將表中 wrzm
,mysh
,sgbh
的數(shù)據(jù)三行變成一行,那就好了。于是我們很自然可以想到用 SUM
(當(dāng)然一開始我沒想到,經(jīng)過朋友提醒),于是改寫上面的 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;
然后得出的結(jié)果為:
mysql_count_result_2
至此,得到了我們想要的結(jié)果,在一條 SQL 語句中實(shí)現(xiàn)了多個(gè)表的 count
統(tǒng)計(jì)。
三、拓展
如圖,我們能獲取到的僅僅是一個(gè)用戶的數(shù)據(jù),但是我們需要統(tǒng)計(jì)的是 user_info
中的所有用戶,那么也很簡(jiǎn)單,我們?cè)俅芜M(jìn)行改寫:
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;
查詢結(jié)果為:
mysql_count_results_3
在這個(gè)結(jié)果中,如果我們需要查看具體某一個(gè)用戶,那么在最后加上
WHERE uid = 123456
即可,如果要排序的話,那么直接加上 ORDER BY
即可。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家在使用或者學(xué)習(xí)mysql的時(shí)候能有所幫助,如果有疑問大家可以留言交流。
- MySQL 大表的count()優(yōu)化實(shí)現(xiàn)
- MySQL中聚合函數(shù)count的使用和性能優(yōu)化技巧
- 關(guān)于mysql中innodb的count優(yōu)化問題分享
- 聊聊MySQL的COUNT(*)的性能
- 詳解 MySQL中count函數(shù)的正確使用方法
- 淺談MySQL 統(tǒng)計(jì)行數(shù)的 count
- mysql count提高方法總結(jié)
- MySQL中無過濾條件的count詳解
- MySQL中count(*)、count(1)和count(col)的區(qū)別匯總
- MySQL COUNT函數(shù)的使用與優(yōu)化
相關(guān)文章
如何恢復(fù)Mysql數(shù)據(jù)庫的詳細(xì)介紹
這里說的MySql恢復(fù)數(shù)據(jù)庫,是指沒有通過正常備份的情況下,通過Mysql保存的數(shù)據(jù)文件如何恢復(fù)數(shù)據(jù)庫2013-09-09MySQL8.0開啟遠(yuǎn)程連接權(quán)限的方法步驟
MySQL8.0設(shè)置遠(yuǎn)程訪問權(quán)限,找了一圈都沒找到一個(gè)適用的,索性自己寫一個(gè),這篇文章主要給大家介紹了關(guān)于MySQL8.0開啟遠(yuǎn)程連接權(quán)限的方法步驟,需要的朋友可以參考下2022-06-06超簡(jiǎn)單的qps統(tǒng)計(jì)方法(推薦)
下面小編就為大家?guī)硪黄?jiǎn)單的qps統(tǒng)計(jì)方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03