使用LEFT JOIN 统计左右存在的数据问题

 更新时间:2022年10月25日 09:00:47   作者:小码code  
最近做了一个数据模块的统计,统计企业收款、发票相关的数据,开始统计是比较简单,后面再拆分账套统计就有点小复杂,这篇文章主要介绍了使用LEFT JOIN 统计左右存在的数据,需要的朋友可以参考下

最近做了一个数据模块的统计,统计企业收款、发票相关的数据,开始统计是比较简单,后面再拆分账套统计就有点小复杂,本文做一个简单的记录。

需求

企业表

企业表t_company有如下字段:标识id、企业名称name:

idname
1腾讯
2百度

收款表

企业对应有收款表t_collection有如下字段:标识id、账套account、企业idcompany_id、收款金额amount

idaccountcompany_idamount
11130
22120
31230
42240

开票表

开票表t_invoice有如下字段:标识id、账套account、企业idcompany_id、发票金额amount

idaccountcompany_idamount
11110
22120
31230
42250

汇总企业统计

现在要做一个统计,统计企业收款金额,以及发票金额,需要将收款表和发票表将company_idgroup up操作。开票表也是做类似的操作,企业表和上面的结果做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

查询结果:

idnamecollection_amountinvoice_amunt
1腾讯5030
2百度7080

再分账套做汇总(重点)

在上面统计的基础上,再拆分账套统计

收款表和发票表做账套的拆分,和企业表做关联:

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

首先是将收款表做账套的拆分,然后关联发票表的账套拆分。看似没有问题,但是left join返回左边的所有记录,以及右边字段相等的数据。

这样就有一个问题:

如果左边表没有的数据,右边的表也不会查出来。比如以上查询收款表不存在的账套,发票表存在账套也不会查出来。这就是left join的局限性。

全表连接解决方案一:

MySQLleft joinright join应该也有full join全表连接。

但是MySQL是不支持full join全表连接。

网上也有解决方案使用union替换full_join,思路是左表左连接右边,左表右连接右边,将上面的两个结果union连接起来:

select * from t1 left join t2 on t1.id = t2.id
union 
select * from t1 right join t2 on t1.id = t2.id;

上面只是两个表的关联,如果三个表或者更多的关联,写起来就比较繁琐了。

全表连接解决方案二:

全表连接就是一个没有限制的左表连接,就是去掉on关联条件,

left join所有的账套,首先要显示全所有的账套,企业表关联账套表,但是两个表是没有关联的,需要去掉on后面的关联条件,但是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
idnameaccount
1腾讯1
1腾讯2
2百度1
2百度2

查询出所有的公司账套之后,再left join收款表和发票表:

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

结果:

idnameaccountcollection_amountinvoice_amunt
1腾讯13010
1腾讯22020
2百度13030
2百度24050

总结

  • 企业分组统计收款和发票表,只需要对企业做group by分组即可。
  • 企业和账套一起分组,left join只会统计左边存在的数据,而需要统计两边都存在的数据。
    • 使用union多表查询比较繁琐。
    • left join使用on 1 = 1查询不添加限制条件,查询所有公司的账套,再关联发票和收款。

参考

到此这篇关于使用LEFT JOIN 统计左右存在的数据的文章就介绍到这了,更多相关left join左右存在的数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql数据库存储过程之游标(光标cursor)详解

    mysql数据库存储过程之游标(光标cursor)详解

    这篇文章主要介绍了mysql数据库存储过程之游标(光标cursor)详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • MySQL执行外部sql脚本文件的命令

    MySQL执行外部sql脚本文件的命令

    sql脚本是包含一到多个sql命令的sql语句,我们可以将这些sql脚本放在一个文本文件中,然后通过相关的命令执行这个sql脚本文件,本文就详细的介绍一下,感兴趣的朋友可以了解一下
    2021-12-12
  • MySQL创建内部临时表的所有场景盘点

    MySQL创建内部临时表的所有场景盘点

    这篇文章主要为大家介绍了MySQL创建内部临时表的所有场景盘点,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 浅谈Mysql指定顺序排序查询

    浅谈Mysql指定顺序排序查询

    给大家用过实例分析了Mysql查询中指定顺序排序的相关技术问题,需要的朋友参考一下吧。
    2017-12-12
  • 如何解决MYSQL8.4.1 MySQL84--ERROR 1524(HY000):Plugin ‘msql_native_password‘ is not loaded问题

    如何解决MYSQL8.4.1 MySQL84--ERROR 1524(HY000):Plugin&n

    这篇文章主要介绍了如何解决MYSQL8.4.1 MySQL84--ERROR 1524(HY000):Plugin ‘msql_native_password‘ is not loaded问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • MySQL GRANT用户授权的实现

    MySQL GRANT用户授权的实现

    授权就是为某个用户赋予某些权限。MySQL 提供了 GRANT 语句来为用户设置权限。具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • SQL中表锁定(LOCK、UNLOCK)的具体使用

    SQL中表锁定(LOCK、UNLOCK)的具体使用

    本文主要介绍了SQL中表锁定(LOCK、UNLOCK)的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • mysql 10w级别的mysql数据插入

    mysql 10w级别的mysql数据插入

    几天前做了一个短信发送东东,一次性要插入10w以上的手机号码。我的个天啊。
    2011-08-08
  • mysql "too many connections" 错误 之 mysql解决方法

    mysql "too many connections" 错误 之 mysql解决方法

    解决方法是修改/etc/mysql/my.cnf,添加以下一行
    2009-06-06
  • MySql数据库单表查询与多表连接查询效率对比

    MySql数据库单表查询与多表连接查询效率对比

    在遇到数据之间的联系很复杂,建表就很纠结,到底该怎么去处理这些复杂的数据呢,是单表查询,然后在业务层去处理数据间的关系,还是直接通过多表连接查询来处理数据关系呢
    2021-09-09

最新评论