标签搜索

mysql查询某个字段有两条重复记录的SQL语句

basil
2019-10-07 / 591 阅读

由于写代码的疏忽,可能会导致数据库多出一条重复的记录,这时需要找到重复的记录把其中一条删除,例如查找以下数据表多出了的parent_order_id相同并且备注为某某某获得奖励的记录

CREATE TABLE `x_fenxiao_reward` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_id` int(10) unsigned NOT NULL COMMENT '总部id',
  `parent_order_id` int(10) unsigned NOT NULL COMMENT 'x_ordinary_pay_record表id',
  `sub_order_id` int(10) unsigned NOT NULL COMMENT 'x_ordinary_pay_goods表id',
  `state` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '0:未结算 1:冻结(发生退款退货) 2:已结算 3:作废',
  `confirm_time` int(10) unsigned NOT NULL COMMENT '自动结算时间:确认收货的时间点+结算的时间间隔fenxiao_settlement_day(转为秒)',
  `reward_level_1` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '业务员的佣金',
  `reward_level_1_client_code` varchar(10) NOT NULL DEFAULT '' COMMENT '业务员的邀请码',
  `last_update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最近更新时间',
  `end_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最终结算时间',
  `remark` varchar(255) NOT NULL DEFAULT '' COMMENT '推广备注(用于关注人推广,签到推广)',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2915 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='业务员佣金明细表';

利用临时表、子查询、count函数和group by结合,整理出来的语句为

SELECT * FROM x_fenxiao_reward WHERE id in(
SELECT
 id
FROM
 (
  SELECT
   parent_order_id,
   COUNT(*) AS count
  FROM
   x_fenxiao_reward
  WHERE
   state = '0'
  GROUP BY
   parent_order_id
  HAVING
   count = 2
 ) AS result
LEFT JOIN x_fenxiao_reward ON x_fenxiao_reward.parent_order_id = result.parent_order_id
) AND remark LIKE '%获得的奖励记录%'
0