#把符合要求数据过滤出去,查询出来全部删除
SELECT
id,sku_id,city_id,storage_id
FROM
pro_product.p_pro_attribute p1
WHERE
p1.id NOTIN (
SELECTMIN(id)
FROM
p_pro_attribute
GROUPBY
sku_id,
city_id,
storage_id
HAVINGCOUNT(*) > 1
)ORDERBY sku_id desc;
#此时执行会报错,mysql不允许在表查询又进行表操作
DELETEFROM
pro_product.p_pro_attribute p1
WHERE
p1.id NOTIN (
SELECTMIN(id)
FROM
p_pro_attribute
GROUPBY
sku_id,
city_id,
storage_id
HAVINGCOUNT(*) > 1
)
#可通过临时表p进行规避错误
SELECT * from p_pro_attribute
WHERE
id NOTIN (select p.id from
( SELECTmax( id ) AS id FROM p_pro_attribute WHERE is_deleted = 0GROUPBY sku_id, city_id, storage_id ) p)
AND is_deleted =0;
#但此时又出现了新问题,由于not in 全表扫描效率很低6万的数据执行了10多分钟,线上数据远远大于6万,会造成严重事故,优化方式left jion效率更高更新操作仅仅几毫秒10万数据
SELECT * from p_pro_attribute p1
LEFTJOIN ( SELECTmax( id ) AS id FROM p_pro_attributeWHERE is_deleted = 0GROUPBY sku_id, city_id, storage_id ) p2
on p1.id = p2.id where p2.id isnulland p1.is_deleted=0;