2015-04-23 15 views
0

我正在寻找一种方法来删除不仅基于一个表而是两个基于重复的数据。在基于两个表加入的MySQL数据库中删除模糊

表1:

ID | NAME  | ETC 
1 | Truck  | 
2 | Boat  | 
3 | Truck  | 
4 | Truck  | 

表2

ID | REL_ID | KEY  | VAL 
450 | 1  | operator | Jim 
451 | 2  | operator | Frank 
452 | 3  | operator | Jake 
453 | 4  | operator | Jim 

我想在这样的方式我只检索记录#搜索重复4从表1中;表1中的标题需要重复,但也要在表2中列出它们的相关键(例如,rec 1和rec 3也是dupe,但它们有不同的操作符)。到目前为止,我试图内部连接表2两次,但我一直困惑如何嵌套做。谢谢!

编辑:期望的结果:我希望运行一个查询,只选择表1中的第4行删除,因为它的名称(卡车和卡车)以及其相关的运算符吉姆和吉姆)。如果我以卡车为名删除所有模糊,我也会删除那些有不同操作员的模糊。

示例查询我已经从表1中选择(删除)所有的受骗者是:

SELECT a.ID, a.title 
FROM table_1 AS a 
    INNER JOIN (
     SELECT title, MIN(id) AS min_id 
     FROM table_1 
     GROUP BY title 
     HAVING COUNT(*) > 1 
    ) AS b ON b.title = a.title 
AND b.min_id <> a.id 

这让我从表1愚弄,但不知道该如何在表2

+0

目前尚不清楚你要在这里完成的。你能给出一个示例查询和一个可能有助于描述你所面临的问题的示例所需的行输出吗? – xathien

+0

_I只检索记录#4_ - 为什么不是'2-Boat'?这似乎没有任何重复。你可以发布一个表格,看看你的查询的输出是什么样的? –

+0

通过检索你的意思是删除?或保持?你想从两个表中删除吗? –

回答

1

这将删除值了两个表给你:

delete t, tt from table1 t inner join table2 tt on t.id = tt.rel_id where t.id in (select * from (select max(t1.id) 
    from table1 t1 
    inner join table2 t2 
     on t1.id = t2.rel_id 
    group by t1.name, t2.val 
    having count(t1.name) > 1)q) 

子查询是嵌套两次因为MySQL是挑剔你如何使用表你想从SUBQ删除ueries。

它不会删除同一项目的多个重复数据删除 - 让我知道,如果它需要

这里有一个演示:http://sqlfiddle.com/#!9/0b7ea/1

这个版本将删除所有的受骗者中只留下一个具有最低ID:

delete x, xx from table1 x inner join table2 xx on x.id = xx.rel_id where x.id in (select * from (
select t.id from table1 t 
    inner join 
    (select min(t1.id) m, t1.name, t2.val 
      from table1 t1 
      inner join table2 t2 
       on t1.id = t2.rel_id 
     group by t1.name, t2.val 
     having count(t1.name) > 1 
    ) q 
    on t.id > q.m and t.name = q.name 
    inner join 
    table2 t2 
     on t.id = t2.rel_id 
     and t2.val = q.val) qx) 

演示了一个位置:http://sqlfiddle.com/#!9/62312/1

+0

对不起,它会删除数值或整行? –

+0

行,对不起,我感到困惑 –

+0

当我运行这个,我仍然看到,它选择第1,3和4行 - 不严格4. –