ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2020-01-29 14:03:03  阅读:363  来源: 互联网

标签:useraddress city orderinfo 记录 表与表 userid 查询 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;

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

reed_rxs 发布了1 篇原创文章 · 获赞 0 · 访问量 12 私信 关注

标签:useraddress,city,orderinfo,记录,表与表,userid,查询,Mysql,连接
来源: https://blog.csdn.net/reed_rxs/article/details/104105854

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有