有2个表
A表 aId  int (主键)
B表 bId  int (主键)
    aId1 int (可为空)
    aId2 int (可为空)
    aId3 int (可为空)
    time datetime (不可为空)A、B表关系:B表中的aId1、aId2、aId3都是A表中的主键值,但两表没有外键关系。现在要删这样的数据:
aId在B表中半年没出现的,把A表的aId记录,B表的包含aId的记录全部删除。mysql5.1数据库,存储过程中用,之前用游标,效率太低,A表近10W条数据,B表近100W条数据。

解决方案 »

  1.   

    aId在B表中半年没出现的:举例说明
    B表的包含aId的记录全部删除。:AID1-3都算?贴建表及插入记录的SQL,及要求结果出来看看
    有代表 性的记录即可
      

  2.   

    delete from a where not exists (select 1 from b where aid1=a.id or aid2=a.id or aid3=a.id and time>curdate()-interval 6 month)
      

  3.   


    CREATE TABLE A (
    aId int not null primary key
    );CREATE TABLE B (
    bId int not null primary key,
    aId1 int,
    aId2 int,
    aId3 int,time datetime
    );INSERT A VALUES (1);
    INSERT A VALUES (2);
    INSERT A VALUES (3);
    INSERT A VALUES (4);INSERT B VALUES (1, 1, null, null, '2010-12-01 00:00:00');
    INSERT B VALUES (2, 3, 2, null, '2010-12-09 00:00:00');
    INSERT B VALUES (3, 2, 3, 4, '2010-12-09 00:00:00');
    INSERT B VALUES (4, null, null, null, '2010-12-09 00:00:00');
    INSERT B VALUES (5, null, 1, null, '2010-12-01 00:00:00');
    aId为1的,从1号后就没在B表中出现过,那就把A中aId=1的删除,B中包含aId为1的记录删除(例子中是bId=1,5)
      

  4.   

    DELETE a,b FROM a INNER JOIN
    (
    SELECT aid FROM (
    SELECT * FROM a a1 LEFT JOIN b b1 ON a1.aId=b1.aId1
    UNION ALL
    SELECT * FROM a a1 LEFT JOIN b b1 ON a1.aId=b1.aId2
    UNION ALL
    SELECT * FROM a a1 LEFT JOIN b b1 ON a1.aId=b1.aId3) a 
    GROUP BY aid 
    HAVING DATEDIFF(CURDATE(),MAX(TIME))>=6) a1 ON a.aId=a1.aid
    INNER JOIN b ON b.aid1=a1.aid OR b.aid2=a1.aid OR b.aid3=a1.aid
      

  5.   

    上述SQL语句用你的数据,如果是6个月
    having CURDATE()-INTERVAL 6 DAY>MAX(TIME)orDELETE a,b FROM a
    INNER JOIN
    (SELECT * FROM b WHERE CURDATE()-INTERVAL 6 DAY>TIME) b1 
    ON b1.aid1=a.aid OR b1.aid2=a.aid OR b1.aid3=a.aid
    INNER JOIN b
    ON b1.bid=b.bid 
      

  6.   

    上述SQL语句用你的数据,如果是6个月
    having CURDATE()-INTERVAL 6 month>MAX(TIME)orDELETE a,b FROM a
    INNER JOIN
    (SELECT * FROM b WHERE CURDATE()-INTERVAL 6 month>TIME) b1  
    ON b1.aid1=a.aid OR b1.aid2=a.aid OR b1.aid3=a.aid
    INNER JOIN b
    ON b1.bid=b.bid
      

  7.   

    外键级联删除,不需要外部控制,MYSQL自己就搞定了。