[MYSQL]删除重复数据

#把符合要求数据过滤出去,查询出来全部删除
SELECT
    id,sku_id,city_id,storage_id
FROM
    pro_product.p_pro_attribute p1
WHERE
     p1.id NOT IN (
    SELECT
        MIN(id)
    FROM
        p_pro_attribute
    GROUP BY
        sku_id,
        city_id,
        storage_id
    HAVING
        COUNT(*) > 1
)ORDER BY sku_id desc;
#此时执行会报错,mysql不允许在表查询又进行表操作
DELETE
FROM
    pro_product.p_pro_attribute p1
WHERE
     p1.id NOT IN (
    SELECT
        MIN(id)
    FROM
        p_pro_attribute
    GROUP BY
        sku_id,
        city_id,
        storage_id
    HAVING
        COUNT(*) > 1
)
#可通过临时表p进行规避错误
SELECT * from p_pro_attribute
WHERE
  id NOT IN (select p.id from
  ( SELECT max( id ) AS id FROM p_pro_attribute WHERE is_deleted = 0 GROUP BY 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
LEFT JOIN ( SELECT max( id ) AS id FROM p_pro_attributeWHERE is_deleted = 0 GROUP BY sku_id, city_id, storage_id ) p2
on p1.id = p2.id where p2.id is null and p1.is_deleted=0;

猜你喜欢

转载自blog.csdn.net/drdongshiye/article/details/81186298