如何删除MySQL数据库中的重复条目?

时间:2013-03-03 01:55:26

标签: php mysql

我有一个如下所示的数据库:

enter image description here

我需要删除第2到第7个条目,我只想要其中一个。如果movie_idquestion_id和值相同,则它们都相同。

我目前正在执行以下操作,它会一直有效,直到它超时,但只有大约一千个条目后才会超时,正如您在ID列中所知,有超过50,000个条目。

$top_index = count($all_movies)-1;$top = $all_movies[$top_index];
$max = $top->id;
for($i = 25200; $i<$max-1;$i++){
    for($j = 0; $j<$max-1;$j++){
        if($i != $j){
            if($all_movies[$i]->movie_id == $all_movies[$j]->movie_id){
                if($all_movies[$i]->question_id == $all_movies[$j]->question_id){
                    if($all_movies[$i]->value == $all_movies[$j]->value){
                        echo 'Need to remove '. $all_movies[$j]->id.':<br> Movie Id:'.$all_movies[$i]->movie_id.' Question ID: '.$all_movies[$i]->question_id.' Value: '.$all_movies[$i]->value.'<br>';
                        echo 'Matched with: <br>'. $all_movies[$i]->id.': Movie Id:'.$all_movies[$j]->movie_id.' Question ID: '.$all_movies[$j]->question_id.' Value: '.$all_movies[$j]->value.'<br>';
                        $delete = $post2->movie_value_delete($all_movies[$j]->id);
                        echo 'Deleted: '.$all_movies[$j]->id.'<br><br>';
                    }
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:3)

与你正在做的事情相比,这样的事情应该是快速的。 在运行之前进行备份:)

DELETE FROM movies_values
WHERE id NOT IN (
    SELECT MIN(id)
    FROM movies_values
    GROUP BY movie_id, question_id, value
)

Lamefix无法写入您正在阅读的表格(凌晨2点,给我一个休息!) - 将movies_values_test复制到movies_values_test2,这样我们就可以从{{1}中选择唯一的ID并从_test2中删除所有不匹配的行。

_test

答案 1 :(得分:2)

使用

DELETE mv2
    FROM movies_values mv1
        JOIN movies_values mv2 USING (movie_id, value, question_id)
    WHERE mv1.id < mv2.id

您将两个表组合在一起并获得等效记录的每个组合。然后删除具有较小id的“合作伙伴”的每条记录。

不要忘记之后设置UNIQUE KEY以防止再次发生此事......