Mysql中关于表与表之间连接查询的问题

三种连接方式

一对一:两张表为一一对应的关系,如编号01在表1与表2中仅有一条记录,现实中极为少见

一对多:如编号01在表1中出现一条记录,而在表2中出现2条甚至多条记录,现实业务中较常见

多对多:顾名思义,同一个编号在两张表中各出现1次以上的记录,业务中少见,个人经验,若采取此种方式连接查询会导致重复计算,与实际业务情况不符,产生错误。

针对多对多情况,举例说明:
电商数据ER图
题目:让求出购买力最强的前十个城市
出现city的表为orderinfo和useraddress,两张表之间通过userinfo的userid可对应起来,注意图中箭头指向为多,即userinfo的用户(userid)为一,在orderinfo中可有多笔订单orderid,则userid为了跟orderid对应上,会出现多次;同理,一个userid也可在useraddress中有多个收件地址,有几个收件地址出现几个对应的userid。实际上orderinfo中的用户、地址与useraddress中的相同,若orderinfo与useraddress通过共有字段userid连接查询,属于典型的多对多连接,orderinfo中每一条相同的userid记录会分别与useraddress中相同userid所有的记录连接,即交叉重复连接,地址相同与地址不同的都会对应连接一次,结果与实际不符,出错。直接通过orderinfo查询即可,详见代码:

select b.city,sum(OrderAmount) c from orderinfo a join
	useraddress b on a.userid=b.userid  	-- 错误写法,此为多对多,重复计算
    group by b.city
    order by c desc
    limit 10;

结果如下:
在这里插入图片描述

--正确写法:
select city,sum(OrderAmount) c from orderinfo
    group by city
    order by c desc
    limit 10;

结果如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值