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全表,分析了许久,不知道具体怎么回事,
   提醒,要是本人细心的话,应该先拿出子查询查下,直接报错就不会酿成此次悲剧了

解决方案 »

  1.   

    复杂的sql 分步执行比较清晰
      

  2.   

    执行一下 select id from (select max(id)  from table  where user_id = xx group by goods_id having count(goods_id)> 1)a看看
      

  3.   

    注意你的 max(id) 未命名
     select id from (select max(id) 
    -------- 这个 id 实际上取的是外层表的 id, 因为你的子查询中没有 id 这个列, 所以既然内层子查询有一条记录,那么这个查询的结果就是 = 外层 id, 很显然满足条件 id in (select id
    所以不删除全表反而是不对的
      

  4.   

    一般来说,在 DBA 的规范中,多表都会要求写清楚列的表名,以避免这种狗血事件,不过程序员多半都不在意这条罢了
      

  5.   

    select id from (select max(id)  为什么当没有max(id)这个列的时候,select id from会读全表的id呢?
      

  6.   


    select id from (select max(id)  为什么当没有max(id)这个列的时候,select id from会读全表的id呢? 
    ----------------------- 子查询里面的 select id 返回的不是全表,是外层表的当前记录的 id
       delete from table where id in (
     这里的 delete 是逐条进行的,对于每一条,都去判断一次子查询,所以对于每一条,子查询都返回一个与当前记录 id 对应的 id 的记录,那最终结果当然是全部满足条件