免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2577 | 回复: 8

【已解决】mysql关于自联结的问题 [复制链接]

论坛徽章:
0
发表于 2012-09-10 22:34 |显示全部楼层
本帖最后由 cenalulu 于 2012-09-11 16:58 编辑

现在有如下一张表:
2.png
其内容为:
1.png

现在,我们发现某物品(其ID为DTNTR)存在问题,
因此想知道生产该物品的供应商生产的其他物品是否也存在这些问题。
执行如下语句及其结果:
select p1.prod_id, p1.prod_name from products as p1, products as p2  where p1.vend_id = p2.vend_id and p1.prod_id = 'dtntr';
1.png

如果执行如下语句:
select p1.prod_id, p1.prod_name from products as p1, products as p2  where p1.vend_id = p2.vend_id and p2.prod_id = 'dtntr';
结果却如下所示:
1.png

为什么都是同一张表,内容相同,只是最后选择的表不同,得到的结果却截然不同呢?

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
发表于 2012-09-11 09:17 |显示全部楼层
问题描述的很详细,先赞一个。
结果不一样的原因是P1表的 ,dtntr --- vend_id 的对应关系和 P2表的这两列对应关系不同。

论坛徽章:
0
发表于 2012-09-11 10:22 |显示全部楼层
回复 2# cenalulu
能说的再详细点么?
我不太明白为什么p1的和p2的列不同


   

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
发表于 2012-09-11 10:50 |显示全部楼层
建议你把 p1.vendor_id,p1.prod_id,p1.prod_name,以及p2 的这三列都select出来,分别执行一次,你就知道原因了

论坛徽章:
0
发表于 2012-09-11 11:39 |显示全部楼层
本帖最后由 licong0527 于 2012-09-11 13:40 编辑

回复 4# cenalulu
按照楼主说的,我试了一下
(1)
select p1.prod_id as prod_id1, p1.prod_name as prod_name1, p1.vend_id as vend_id1 from products as p1, products as p2  where p1.vend_id = p2.vend_id and p1.prod_id = 'dtntr';
结果如下:
3.png

(2)
select p2.vend_id as vend_id2, p2.prod_id as prod_id2, p2.prod_name as prod_name2 from products as p1, products as p2  where p1.vend_id = p2.vend_id and p1.prod_id = 'dtntr';
结果如下:
4.png

(3)
select p2.vend_id as vend_id2, p2.prod_id as prod_id2, p2.prod_name as prod_name2 from products as p1, products as p2  where p1.vend_id = p2.vend_id and p2.prod_id = 'dtntr';
结果如下:
5.png

(4)
select p1.prod_id as prod_id1, p1.prod_name as prod_name1, p1.vend_id as vend_id1 from products as p1, products as p2  where p1.vend_id = p2.vend_id and p2.prod_id = 'dtntr';
结果如下:
6.png

规律我是发现了:select的表名和过滤条件中的表名要不一致时,才可以得到我们想要的效果。
不过,本人还是不理解为什么呢?

   


   

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
发表于 2012-09-11 13:58 |显示全部楼层
执行下这句,你会看到最终结果的宽表。
select p1.prod_id as prod_id1, p1.prod_name as prod_name1, p1.vend_id as vend_id1,p2.vend_id as vend_id2, p2.prod_id as prod_id2, p2.prod_name as prod_name2 from products as p1, products as p2  where p1.vend_id = p2.vend_id and p2.prod_id = 'dtntr';

实际上就是差别就在于是用驱动表做约束,还是用数据表做约束。

论坛徽章:
0
发表于 2012-09-11 14:41 |显示全部楼层
回复 6# cenalulu
  谢谢呢,终于明白了

   

论坛徽章:
1
2015亚冠之本尤德科
日期:2015-06-05 17:25:48
发表于 2012-09-11 17:24 |显示全部楼层
这个的关键是不是看自连接的时候,看谁驱动谁?通过where条件p2.prod_id = 'dtntr';(是p1还是p2来区分)

论坛徽章:
8
CU大牛徽章
日期:2013-09-18 15:20:48CU大牛徽章
日期:2013-09-18 15:20:58CU大牛徽章
日期:2013-09-18 15:21:06CU大牛徽章
日期:2013-09-18 15:21:12CU大牛徽章
日期:2013-09-18 15:21:17天秤座
日期:2013-10-30 14:01:03摩羯座
日期:2013-11-29 18:02:31luobin
日期:2016-06-17 17:46:36
发表于 2012-09-12 16:46 |显示全部楼层
又发现cenalulu大侠身影
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP