使用LEFT?JOIN?統(tǒng)計左右存在的數(shù)據(jù)問題
最近做了一個數(shù)據(jù)模塊的統(tǒng)計,統(tǒng)計企業(yè)收款、發(fā)票相關(guān)的數(shù)據(jù),開始統(tǒng)計是比較簡單,后面再拆分賬套統(tǒng)計就有點(diǎn)小復(fù)雜,本文做一個簡單的記錄。
需求
企業(yè)表
企業(yè)表t_company有如下字段:標(biāo)識id、企業(yè)名稱name:
| id | name |
|---|---|
| 1 | 騰訊 |
| 2 | 百度 |
收款表
企業(yè)對應(yīng)有收款表t_collection有如下字段:標(biāo)識id、賬套account、企業(yè)idcompany_id、收款金額amount:
| id | account | company_id | amount |
|---|---|---|---|
| 1 | 1 | 1 | 30 |
| 2 | 2 | 1 | 20 |
| 3 | 1 | 2 | 30 |
| 4 | 2 | 2 | 40 |
開票表
開票表t_invoice有如下字段:標(biāo)識id、賬套account、企業(yè)idcompany_id、發(fā)票金額amount:
| id | account | company_id | amount |
|---|---|---|---|
| 1 | 1 | 1 | 10 |
| 2 | 2 | 1 | 20 |
| 3 | 1 | 2 | 30 |
| 4 | 2 | 2 | 50 |
匯總企業(yè)統(tǒng)計
現(xiàn)在要做一個統(tǒng)計,統(tǒng)計企業(yè)收款金額,以及發(fā)票金額,需要將收款表和發(fā)票表將company_id做group up操作。開票表也是做類似的操作,企業(yè)表和上面的結(jié)果做left join連接操作,sql如下:
select tc.id,tc.name,tc2.amount as collection_amount,ti.amount as invoice_amunt from t_company tc left join ( select company_id,sum(amount) as amount from t_collection group by company_id ) tc2 on tc.id = tc2.company_id left join ( select company_id,sum(amount) as amount from t_invoice group by company_id ) ti on tc.id = ti.company_id
查詢結(jié)果:
| id | name | collection_amount | invoice_amunt |
|---|---|---|---|
| 1 | 騰訊 | 50 | 30 |
| 2 | 百度 | 70 | 80 |
再分賬套做匯總(重點(diǎn))
在上面統(tǒng)計的基礎(chǔ)上,再拆分賬套統(tǒng)計。

收款表和發(fā)票表做賬套的拆分,和企業(yè)表做關(guān)聯(lián):
select tc.id,tc.name,tc2.amount as collection_amount,ti.amount as invoice_amunt from t_company tc left join ( select company_id,account,sum(amount) as amount from t_collection group by company_id,account ) tc2 on tc.id = tc2.company_id left join ( select company_id,account,sum(amount) as amount from t_invoice group by company_id,account ) ti on tc.id = ti.company_id and tc2.account = ti.account
首先是將收款表做賬套的拆分,然后關(guān)聯(lián)發(fā)票表的賬套拆分??此茮]有問題,但是left join返回左邊的所有記錄,以及右邊字段相等的數(shù)據(jù)。

這樣就有一個問題:
如果左邊表沒有的數(shù)據(jù),右邊的表也不會查出來。比如以上查詢收款表不存在的賬套,發(fā)票表存在賬套也不會查出來。這就是
left join的局限性。
全表連接解決方案一:
MySQL有left join、right join應(yīng)該也有full join全表連接。
但是
MySQL是不支持full join全表連接。
網(wǎng)上也有解決方案使用union替換full_join,思路是左表左連接右邊,左表右連接右邊,將上面的兩個結(jié)果union連接起來:
select * from t1 left join t2 on t1.id = t2.id union select * from t1 right join t2 on t1.id = t2.id;
上面只是兩個表的關(guān)聯(lián),如果三個表或者更多的關(guān)聯(lián),寫起來就比較繁瑣了。
全表連接解決方案二:
全表連接就是一個沒有限制的左表連接,就是去掉on關(guān)聯(lián)條件,
要left join所有的賬套,首先要顯示全所有的賬套,企業(yè)表關(guān)聯(lián)賬套表,但是兩個表是沒有關(guān)聯(lián)的,需要去掉on后面的關(guān)聯(lián)條件,但是MySQL語法連接后面必須要加on,將約束條件改成1 = 1即可:
select tc.id,tc.name,ta.id as account from t_company tc left join t_account ta on 1 = 1
| id | name | account |
|---|---|---|
| 1 | 騰訊 | 1 |
| 1 | 騰訊 | 2 |
| 2 | 百度 | 1 |
| 2 | 百度 | 2 |
查詢出所有的公司賬套之后,再left join收款表和發(fā)票表:
select tc.id,tc.name,tc.account,tc2.amount as collection_amount,ti.amount as invoice_amunt from ( select tc.id,tc.name,ta.id as account from t_company tc left join t_account ta on 1 = 1 )tc left join ( select company_id,account,sum(amount) as amount from t_collection group by company_id,account ) tc2 on tc.id = tc2.company_id and tc.account = tc2.account left join ( select company_id,account,sum(amount) as amount from t_invoice group by company_id,account ) ti on tc.id = ti.company_id and tc.account = ti.account
結(jié)果:
| id | name | account | collection_amount | invoice_amunt |
|---|---|---|---|---|
| 1 | 騰訊 | 1 | 30 | 10 |
| 1 | 騰訊 | 2 | 20 | 20 |
| 2 | 百度 | 1 | 30 | 30 |
| 2 | 百度 | 2 | 40 | 50 |
總結(jié)
- 企業(yè)分組統(tǒng)計收款和發(fā)票表,只需要對企業(yè)做
group by分組即可。 - 企業(yè)和賬套一起分組,
left join只會統(tǒng)計左邊存在的數(shù)據(jù),而需要統(tǒng)計兩邊都存在的數(shù)據(jù)。- 使用
union多表查詢比較繁瑣。 left join使用on 1 = 1查詢不添加限制條件,查詢所有公司的賬套,再關(guān)聯(lián)發(fā)票和收款。
- 使用
參考
到此這篇關(guān)于使用LEFT JOIN 統(tǒng)計左右存在的數(shù)據(jù)的文章就介紹到這了,更多相關(guān)left join左右存在的數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MYSQL ERROR 1045 (28000): Access denied for user (using pass
Mysql中添加用戶之后可能出現(xiàn)登錄時提示ERROR 1045 (28000): Access denied for user的錯誤.2009-07-07
mysql自增navicat_navicat如何設(shè)置主鍵自增
通過Navicat設(shè)置MySQL表的主鍵自增,步驟包括:打開Navicat連接數(shù)據(jù)庫,選擇表并設(shè)計,右擊id字段設(shè)置為主鍵,然后勾選自動遞增功能,這樣每次插入新記錄時,id字段都會自動遞增2025-01-01
Linux系統(tǒng)中安裝MySQL的詳細(xì)圖文步驟
本文的主要內(nèi)容是在 Linux 上安裝 MySQL,以下內(nèi)容是源于 B站 - MySQL數(shù)據(jù)庫入門到精通 整理而來,需要的朋友可以參考下2023-06-06
MYSQL 隨機(jī) 抽取實(shí)現(xiàn)方法及效率分析
MYSQL的隨機(jī)抽取實(shí)現(xiàn)方法。舉個例子,要從tablename表中隨機(jī)提取一條記錄,大家一般的寫法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。2009-05-05
Mysql根據(jù)時間查詢?nèi)掌诘膬?yōu)化技巧
這篇文章主要介紹了Mysql根據(jù)時間查詢?nèi)掌诘膬?yōu)化技巧,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2018-03-03
MySQL?數(shù)據(jù)庫如何實(shí)現(xiàn)存儲時間
這篇文章主要介紹了MySQL?數(shù)據(jù)庫如何實(shí)現(xiàn)存儲時間,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
MySQL數(shù)據(jù)庫表分區(qū)注意事項(xiàng)大全【推薦】
這篇文章主要介紹了MySQL數(shù)據(jù)庫表分區(qū)注意事項(xiàng)相關(guān)內(nèi)容,比較全面,這里分享給大家,需要的朋友可以參考。2017-10-10
mysql分組后合并顯示一個字段的多條數(shù)據(jù)方式
這篇文章主要介紹了mysql分組后合并顯示一個字段的多條數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01

