mysql按条件去重复数据_Mysql查询重复数据并按条件删除重复行

在对游戏进行合区的过程中, 存在一个情况,

那就是当一个账号在两个区都存在角色的时候, 需要按照条件对重复角色进行删除,

比如以等级为条件, 只保留等级高的.

解决方案

用mysql语句, 两条就可以解决:

首先, 第一条语句

create temporary table temp as

select user_id,max(level) as MAXID

from user group by open_id;

这一句是将表user里面的数据按open_id进行分组,

然后查询每组里等级最大的行的user_id,level两个字段,

将查询结果存在一个临时表temp里面.

第二条语句

delete from user where user_id not in

(select user_id from temp);

将user表里,没有存入temp表的user_id字段所在行删掉.

这部分内容添加于9.2日晚———————-begin

刚刚测试发现, 上面两条命令存在一定的问题, 原因很简单,

第一条语句存入temp的user_id

并不一定就是max(level)所在行的user_id.

那么我用了另一种方式来解决, 三条命令:

1. create temporary table temp1 as select level, user_id, open_id from user order by level;

将user表的三项字段存入临时表temp1, 以level进行排序.

2. create temporary table temp2 as select user_id, level, open_id from temp1 group by open_id having count(open_id) > 1;

按open_id分组, 将分组后有重复数据的组的首个数据存入临时表temp2,

因为默认以level排序, 所以存入的是有重复项的低等级玩家id.

delete from user where user_id in (select user_id from temp2);

删除啦!

————————————————end

报错

有的小伙伴在执行第一条命令时可能会报下面的错误

ERROR 1055 (42000): Expression #1 of SELECT

list is not in GROUP BY clause and contains nonaggregated

column 'd1.user.user_id' which is not functionally

dependent on columns in GROUP BY clause;

this is incompatible with sql_mode=only_full_group_by

那是因为mysql默认的设置要求,

group By后查询的列必须存在于group by后的字段集中,

修改设置即可, 在mysql命令行执行下面语句

set @@sql_mode='

STRICT_TRANS_TABLES,

NO_ZERO_IN_DATE,

NO_ZERO_DATE,

ERROR_FOR_DIVISION_BY_ZERO,

NO_AUTO_CREATE_USER,

NO_ENGINE_SUBSTITUTION';

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值