表结构如下:
CREATE TABLE `test` (
  `testid` bigint(20) NOT NULL AUTO_INCREMENT,
  `memberid` bigint(20) DEFAULT NULL,
  `source` smallint(6) DEFAULT NULL,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `money` decimal(8,2) DEFAULT NULL,
  `sourceid` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`creditid`),
  KEY `credit_memberid_index` (`memberid`),
  CONSTRAINT `fk_memberid` FOREIGN KEY (`memberid`) REFERENCES `t_member` (`memberid`)
) ENGINE=InnoDB AUTO_INCREMENT=20904 DEFAULT CHARSET=utf8;要求source='0' 删除sourceid一样的记录中非第一条的记录,不知道怎么优化,自己写的程序对1000条就要16分钟,总记录一共是2万多点谢谢!

解决方案 »

  1.   

    没有看到记录,
    贴记录及正确结果贴出来看看
    TRY:
    SELECT A.* FROM TT A
    LEFT JOIN
    (SELECT memberid,MIN(sourceid) AS MI FROM TT GROUP BY memberid) B
    ON A.memberid=B.memberid AND A.sourceid=MI
    WHERE A.source='0' AND B.sourceid IS NOT NULL
      

  2.   

    你现在的语句是什么? 如果是用的 in 换成 inner join 试试
      

  3.   

    TRY:
    SELECT A.* FROM TT A
    LEFT JOIN
    (SELECT sourceid,MIN(testid) AS MI FROM TT GROUP BY sourceid) B
    ON A.sourceid=B.sourceid AND A.testid=MI
    WHERE A.source='0' AND B.sourceid IS NOT NULL
      

  4.   

    我的语句中是使用了in,估计就是这个特别慢wwwwa的方法可以取出重复的记录中最小的一条,对我逆向处理很有帮助,不知道mysql可不可以直接insert ... (select * from ....)这样的使用
      

  5.   

    可以,假设RR、TT表结构一致
    insert into rr
    SELECT A.* FROM TT A
    LEFT JOIN
    (SELECT sourceid,MIN(testid) AS MI FROM TT GROUP BY sourceid) B
    ON A.sourceid=B.sourceid AND A.testid=MI
    WHERE A.source='0' AND B.sourceid IS NOT NULL
      

  6.   

    我使用时出现Lock wait timeout exceeded; try restarting transaction,不知应该如何解决?我的id是自增字段是否有影响?
    谢谢
      

  7.   

    去掉自增字段,生成新表后,再添加试试,表引擎?
    在SELECT去掉自增字段, OR 在表中DROP 自增字段试试
      

  8.   

    检查应用程序或者某些操作是否使用了lock table或者使用事务的时候只有'begin'而没有'commit/rollback'
      

  9.   

    我是直接在mysql客户端工具里执行的,没有begin,如果要使用begin commit应该怎么写?
    我试了去了自增还是不行
      

  10.   

    原因是你使用的InnoDB   表类型的时候,默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,因为有的锁等待超过了这个时间,所以抱错.你可以把这个时间加长,或者优化存储过程,事务避免过长时间的等待.innodb_lock_wait_timeout = 300 OR 更大
    修改后停止MYSQL,再启动,试试。
      

  11.   

    好的,谢谢!又多学了点我使用mysql工具将数据导出再导入处理了,傻是傻点不过一样可以达到要求,再次感谢!