mysql去重删除数据只保留一条(保留id最小的那一条)

这里记录一下用到的语句和语句模板:

先把我用到语句分别列出来:

-- 查询出重复的数据
SELECT
  COUNT(*) as repeats,
  address,
  signer_name,
  signer_mobile
FROM user_operation_useraddress
GROUP BY
  address,
  signer_name,
  signer_mobile
HAVING
  repeats > 1;

-- 查询出重复的数据中最小的id
SELECT
  MIN(id) as min_id,
  COUNT(*) as repeats,
  address,
  signer_name,
  signer_mobile
FROM user_operation_useraddress
GROUP BY
  address,
  signer_name,
  signer_mobile
HAVING
  repeats > 1;

-- 查出重复的数据中非最小的id(需要删除的)
SELECT
  id
FROM user_operation_useraddress
WHERE
  (address, signer_name, signer_mobile) IN (
    SELECT
      address,
      signer_name,
      signer_mobile
    FROM user_operation_useraddress
    GROUP BY
      address,
      signer_name,
      signer_mobile
    HAVING
      COUNT(*) > 1
  )
  AND id NOT IN (
    SELECT
      MIN(id)
    FROM user_operation_useraddress
    GROUP BY
      address,
      signer_name,
      signer_mobile
    HAVING
      COUNT(*) > 1
  );

-- 建立一张临时表t
SELECT
  id
FROM (
    SELECT
      id
    FROM user_operation_useraddress
    WHERE
      (address, signer_name, signer_mobile) IN (
        SELECT
          address,
          signer_name,
          signer_mobile
        FROM user_operation_useraddress
        GROUP BY
          address,
          signer_name,
          signer_mobile
        HAVING
          COUNT(*) > 1
      )
      AND id IN (
        SELECT
          MIN(id)
        FROM user_operation_useraddress
        GROUP BY
          address,
          signer_name,
          signer_mobile
        HAVING
          COUNT(*) > 1
      )
  ) as t;

-- 删除重复的数据(只保留一条,保留最小id的)
DELETE FROM user_operation_useraddress
WHERE
  id IN (
    SELECT
      id
    FROM (
        SELECT
          id
        FROM user_operation_useraddress
        WHERE
          (address, signer_name, signer_mobile) IN (
            SELECT
              address,
              signer_name,
              signer_mobile
            FROM user_operation_useraddress
            GROUP BY
              address,
              signer_name,
              signer_mobile
            HAVING
              COUNT(*) > 1
          )
          AND id IN (
            SELECT
              MIN(id)
            FROM user_operation_useraddress
            GROUP BY
              address,
              signer_name,
              signer_mobile
            HAVING
              COUNT(*) > 1
          )
      ) as t
  );

在Mysql中是不能删除查询出来的记录,而是要通过一张临时表来解决,以上是我用到的语句。
然后下面给出删除重复数据的模板,可以套用:

-- 删除重复的数据(只保留一条,保留最小id的)
DELETE FROM table_name
WHERE
  id IN (
    SELECT
      id
    FROM (
        SELECT
          id
        FROM table_name
        WHERE
          (field1, field2, field3) IN (
            SELECT
              field1,
              field2,
              field3
            FROM table_name
            GROUP BY
              field1,
              field2,
              field3
            HAVING
              COUNT(*) > 1
          )
          AND id IN (
            SELECT
              MIN(id)
            FROM table_name
            GROUP BY
              field1,
              field2,
              field3
            HAVING
              COUNT(*) > 1
          )
      ) as t
  );

参考文章:简书

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值