2015-05-15 3 views
3

мне нужно удалить дубликаты из таблицы, которая выглядит следующим образом:Удаление дубликатов в базе данных SQL на состояние

id   post_author post_title 
----------------------------------------------------------------------------- 
21319  1    Youngstown State University 
20535  1    Yo San University of Traditional Chinese Medicine 
30268  29    Yo San University of Traditional Chinese Medicine 
29747  29    Yeshiva University 
21964  1    Yale University 
29247  29    Yale University 
29497  29    Xavier University of Louisiana 
21916  1    Xavier University 
29862  29    Xavier University 
29860  29    Wright State University-Main Campus 
20915  1    Wright State University-Lake Campus 
21562  1    World Mission University 
30267  29    World Mission University 

В принципе, если есть две записи с одинаковыми post_title, мне нужно удалить одну с post_author = 1, но если post_title уникален, запись должна быть оставлена ​​как есть.

Как это можно сделать с помощью SQL-запроса?

EDIT:

Я попробовал запрос, предложенный Mureinik. Запрос выглядит следующим образом:

DELETE t FROM wp_posts AS t 
WHERE t.post_author = 1 AND 
EXISTS (SELECT * FROM wp_posts s 
       WHERE t.post_title = s.post_title 
       AND s.post_authot != 1) 

Но я получил ошибку:

[Err] 1093 - You can't specify target table 't' for update in FROM clause 

Что я делаю неправильно?

+1

это или нет? – Sherlock

+1

Это на mysql или postgresql? –

+0

Это удаление, мне нужно удалить дубликаты. Это для MySQL –

ответ

1

Вы можете установить условие на post_author = 1 где есть более чем один post_title с временной таблицей:

CREATE TEMPORARY TABLE t_del AS SELECT post_title 
        FROM t 
        GROUP BY post_title 
        HAVING count(post_title)>1;    

DELETE FROM t 
WHERE post_author = 1 
    AND post_title IN (select post_title FROM t_del) ; 

SQL Fiddle here

+0

У меня ошибка 1093, запустив этот запрос. –

+1

Вы правы, вам нужна временная таблица. Это невозможно сделать в одном SQL. Проверьте мой обновленный ответ – kiks73

+0

Это сделало это для меня. Спасибо! –

2

Вы можете использовать exists оператор:

DELETE FROM my_table t 
WHERE post_author = 1 AND 
     EXISTS (SELECT * 
       FROM my_table s 
       WHERE t.post_title = s.post_title AND 
         s.post_author != 1) 
+0

Я пробовал это, но получил ошибку. Пожалуйста, взгляните на обновленный вопрос. Любые идеи о том, что я сделал неправильно? –

0

С in оператора:

delete from TableName where post_author = 1 
and post_title in(select post_title from TableName group by post_title having count(*) > 1) 
Смежные вопросы