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

三种连接方式

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

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

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

针对多对多情况,举例说明:
Mysql中关于表与表之间连接查询的问题
题目:让求出购买力最强的前十个城市
出现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;

结果如下:
Mysql中关于表与表之间连接查询的问题

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

结果如下:
Mysql中关于表与表之间连接查询的问题

Mysql中关于表与表之间连接查询的问题Mysql中关于表与表之间连接查询的问题 reed_rxs 发布了1 篇原创文章 · 获赞 0 · 访问量 12 私信 关注
上一篇:Oracle row_number() over( order by )的经典案例


下一篇:MySQL命令行导入含空值的orderinfo和userinfo字段内容