Как удалить строку таблицы, если поле post_title дублируется в другой строке?

Возможный дубликат:
Удалить повторяющиеся строки, оставив самые старые Только ряд?

У меня есть posts_table в моей БД. В этой таблице posts_table есть поля post_title, post_id (и некоторые другие, которые не имеют значения).

Мне нужно удалить одну из строк, если post_title повторяется в другой строке.

Пример:

posts_table
-------------------------------------------
post_id  | post_title
-------------------------------------------
501      |  Some post title here  
502      |  Another post title
503      |  A test post tile
504      |  Some post title here  (this is duplicated, i need to delete this row)
505      |  A different post title

С помощью приведенного ниже предложения я могу проверить все дублированные post_titles

SELECT    post_title, COUNT(post_title) AS dup_count
FROM      posts_table
GROUP BY  post_title
HAVING    (COUNT(post_title) > 1) 

Вопрос в том, как я могу удалить все строки с дубликатами post_titles??

Лучший и самый быстрый запрос для этого:

delete from posts_table where post_id in (
  select post_id from (
    select post_id from posts_table a group by post_title having count(post_title) > 1
  ) b
)

person Lucas Matos    schedule 08.02.2012    source источник
comment
Вы действительно хотите удалить их все или все, кроме одного? Если да, то какой оставить?   -  person CompanyDroneFromSector7G    schedule 08.02.2012
comment
Также я сомневаюсь, что ваш SQL будет работать, поскольку вы смешиваете агрегированный и неагрегированный вывод.   -  person CompanyDroneFromSector7G    schedule 08.02.2012
comment
Мне нужно удалить ОДНУ из повторяющихся строк и оставить другую нетронутой, не имеет значения, какая из них будет удалена. И я не знаю, что вы имеете в виду, ваш sql, но это предложение правильно извлекает post_title и сколько раз оно было найдено.   -  person Lucas Matos    schedule 08.02.2012
comment
@Lucas Да, теперь SQL выглядит нормально, вы его отредактировали.   -  person CompanyDroneFromSector7G    schedule 08.02.2012


Ответы (1)


Попробуй это:

DELETE FROM Posts_Table 
WHERE Post_ID NOT IN    
    (
     SELECT a.Post_ID
     FROM
        (
         SELECT Post_Title, Post_ID 
         FROM Posts_Table 
         GROUP BY Post_Title
         ) a
    )
person John Woo    schedule 08.02.2012
comment
Юк! Он удалил все в моей таблице... Не работает... - person huelbois; 08.02.2012
comment
@huelbois, о, опечатка, я забыл поставить NOT и GROUP BY в запрос, попробуйте еще раз. - person John Woo; 08.02.2012
comment
Хорошо, теперь это работает. Опасная опечатка! - person huelbois; 08.02.2012
comment
@huelbois извините за первый вопрос. - person John Woo; 08.02.2012
comment
Ну это только хрень в моей таблице была, создал ее только для того, чтобы попытаться ответить! Отменил мой голос. - person huelbois; 08.02.2012
comment
@huelbois спасибо, я рад, что решил вашу проблему. - person John Woo; 08.02.2012
comment
johntotetwoo, спасибо, все работает. Так это предложение слишком тяжело для сервера? можно ли выполнять его каждый раз, когда создается новый пост? Я говорю о 100+ постах в день. - person Lucas Matos; 08.02.2012