MySQL去重留一

思路:

1.  查询所有重复记录,保留其中id最小的一个。(根据重复条件分组,如 group by mobile,根据需求选择要保留的那一个)

2.  自连接,使用重复记录条件作为连接条件(如根据手机号码去重,期望一个手机号仅对应一条记录,则使用手机号作为连接条件)

3. 删除除保留的记录之外的所有记录,如选择保留ID为最小的那条记录,则删除所有大于该id的所有记录。

根据思路编写的SQL:

DELETE mst 
FROM
    m_staff mst
    LEFT JOIN (
SELECT
    min( id ) AS id,
    phone,
NAME 
FROM
    m_staff 
GROUP BY
    phone 
HAVING
    count( * ) > 1 
    ) mst2 ON mst2.phone = mst.phone 
WHERE
    mst.id > mst2.id;

上述SQL报错:1093-You can't specify target table 'm_staff' for update in FROM clause, Time: 0.003000s

执行SQL语句时出现这个错误。原因是在更新这个表和数据时又查询了它,而查询的数据又做了更新的条件

 

调整为以下写法可执行,原因TODO

DELETE mst 
FROM
    m_staff mst
    LEFT JOIN (
SELECT
    min( id ) AS id,
    phone,
NAME 
FROM
    m_staff 
GROUP BY
    phone 
HAVING
    count( * ) > 1 
    ) mst2 ON mst2.phone = mst.phone 
WHERE
    mst.id > mst2.id;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值