2015-04-23 3 views
0

Я ищу способ удаления дубликатов, основанных не только на одной таблице, но и на двух.Удалить дубликаты в MySQL db на основе двух подключенных таблиц

Таблица 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 также являются обманами, но у них разные операторы). До сих пор я дважды пытался подключиться к таблице 2, но я все время путаюсь с тем, как это сделать. Спасибо!

EDIT: Желаемый результат: Я хотел бы выполнить запрос, который выбирает только строку 4 в таблице 1 для удаления, так как он является дубликатом как в своем названии (Truck и Truck), а также в его соответствующем операторе (Джим и Джим). Если бы я удалил всех обманов с именем Truck, я также удалю те, у которых есть разные операторы.

Пример запроса У меня было, что выбирает (для удаления) все обманутые из таблицы 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

Эта версия будет удалить все обманутые и оставить только один с наименьшим идентификатором:

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. –

Смежные вопросы