0

我有一个看起来像这样的数据库:

在此处输入图像描述

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

我目前正在执行以下操作,它一直有效,直到超时,但仅在大约一千个条目后超时,正如您通过 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>';
                    }
                }
            }
        }
    }
}
4

2 回答 2

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以便我们可以从中选择唯一 ID_test2并从中删除任何不匹配的行_test

DELETE FROM movies_values_test
WHERE id NOT IN (
    SELECT MIN(id)
    FROM movies_values_test2
    GROUP BY movie_id, question_id, value
)
于 2013-03-03T02:03:01.200 回答
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事后设置一个,以防止这种情况再次发生......

于 2013-03-03T02:25:57.980 回答