delete from table where id in ( select id from (select max(id) from table where user_id = xx group by goods_id having count(goods_id)> 1)a );
看這條sql原意是想洗掉用戶商品id重復的記錄,明顯是錯誤的,因為子查詢是錯誤的,正解是
delete from table where id in ( select b from (select max(id) as b from table where user_id = xx group by goods_id having count(goods_id)> 1)a );
個人糾結的并不是這個,是sql子查詢明明是錯誤的,但是mysql執行真正操作邏輯是: 當user_id=xx存在的某條記錄時,會進行 delte全表,分析了許久,不知道具體怎么回事,
提醒,要是本人細心的話,應該先拿出子查詢查下,直接報錯就不會釀成此次悲劇了

uj5u.com熱心網友回復:
應該不會被執行啊。uj5u.com熱心網友回復:
復雜的sql 分步執行比較清晰uj5u.com熱心網友回復:
執行一下 select id from (select max(id) from table where user_id = xx group by goods_id having count(goods_id)> 1)a看看uj5u.com熱心網友回復:
注意你的 max(id) 未命名select id from (select max(id)
-------- 這個 id 實際上取的是外層表的 id, 因為你的子查詢中沒有 id 這個列, 所以既然內層子查詢有一條記錄,那么這個查詢的結果就是 = 外層 id, 很顯然滿足條件 id in (select id
所以不洗掉全表反而是不對的
uj5u.com熱心網友回復:
一般來說,在 DBA 的規范中,多表都會要求寫清楚列的表名,以避免這種狗血事件,不程序式員多半都不在意這條罷了uj5u.com熱心網友回復:
select id from (select max(id) 為什么當沒有max(id)這個列的時候,select id from會讀全表的id呢?
uj5u.com熱心網友回復:
select id from (select max(id) 為什么當沒有max(id)這個列的時候,select id from會讀全表的id呢?
----------------------- 子查詢里面的 select id 回傳的不是全表,是外層表的當前記錄的 id
delete from table where id in (
這里的 delete 是逐條進行的,對于每一條,都去判斷一次子查詢,所以對于每一條,子查詢都回傳一個與當前記錄 id 對應的 id 的記錄,那最終結果當然是全部滿足條件
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/112403.html
標籤:MySQL
上一篇:關于MySQL多表聯查并求和計算
