Mysql中关于表与表之间连接查询的问题
作者:互联网
三种连接方式
一对一:两张表为一一对应的关系,如编号01在表1与表2中仅有一条记录,现实中极为少见
一对多:如编号01在表1中出现一条记录,而在表2中出现2条甚至多条记录,现实业务中较常见
多对多:顾名思义,同一个编号在两张表中各出现1次以上的记录,业务中少见,个人经验,若采取此种方式连接查询会导致重复计算,与实际业务情况不符,产生错误。
针对多对多情况,举例说明:
题目:让求出购买力最强的前十个城市
出现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;
结果如下:
标签:useraddress,city,orderinfo,记录,表与表,userid,查询,Mysql,连接 来源: https://blog.csdn.net/reed_rxs/article/details/104105854