我有一个如下所示的数据库:
我需要删除第2到第7个条目,我只想要其中一个。如果movie_id
,question_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>';
}
}
}
}
}
}
答案 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
以防止再次发生此事......