为了账号安全,请及时绑定邮箱和手机立即绑定

该删除语句为什么在去掉where条件后会把整个左边的数据表都删除啊DELETE t1 FROM tdb_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name)>=2) AS t2 ON t1.goods_name = t2.goods_name WHERE t1.goods_id>t2.goods_id;

DELETE t1 FROM tdb_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name)>=2) AS t2 ON t1.goods_name = t2.goods_name WHERE t1.goods_id>t2.goods_id;

正在回答

6 回答

因为t1里符合

 ON t1.goods_name = t2.goods_name 

的记录有18,19,21,22,而t2里的记录是1819,所以不加where会把t1里的四条全部删掉,加了

 WHERE t1.goods_id>t2.goods_id

就只会删掉比1819大的2122。

20和23因为不符合 ON t1.goods_name = t2.goods_name 所以在前面就被排除掉了


4 回复 有任何疑惑可以回复我~
#1

Refactor易先生 提问者

非常感谢!
2015-09-18 回复 有任何疑惑可以回复我~

相当于ON条件被使用了两次

0 回复 有任何疑惑可以回复我~
#1

亜門

确实按道理说,ON是被用了两次才会得到这样的结果,但是为什么ON会被用两次?
2017-08-25 回复 有任何疑惑可以回复我~

但是在多表删除语句中:WHERE 要与ON联系起来使用,所以最终得到的等同于ti LEFT JOIN t2 ON t1.goods_name = t2.goods_name(ON t1.goods_name = t2.goods_name)WHERE t1.goods_id>t2.goods_id

1 回复 有任何疑惑可以回复我~

问了好久才搞清楚!这里有个关键问题老师没讲:ti LEFT JOIN t2 ON t1.goods_name = t2.goods_name ,会得到t1所有记录,如果循着这样的思路加上WHERE t1.goods_id>t2.goods_id;应该删掉20,21,22,23。


0 回复 有任何疑惑可以回复我~

如果不加where,因为是left join,是不是就会显示左边表的全部?

如图所示:

http://img1.sycdn.imooc.com//568342c90001d5c203140317.jpg

加上where,就把左边表的很多数据过滤掉,剩下的就是where条件里面的数据

0 回复 有任何疑惑可以回复我~

在t1里面大于t2的有20,21,22,23但是为什么加where条件后就只会删除ID为21和22的记录呢

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
与MySQL的零距离接触
  • 参与学习       396886    人
  • 解答问题       3353    个

本课程涵盖全部MySQL数据库的基础,学习MySQL数据库的基础知识

进入课程

该删除语句为什么在去掉where条件后会把整个左边的数据表都删除啊DELETE t1 FROM tdb_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name)>=2) AS t2 ON t1.goods_name = t2.goods_name WHERE t1.goods_id>t2.goods_id;

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信