1

IDに基づいて他の2つのテーブルを接続するリレーショナルテーブルがあります。両方の列が重複している可能性がありますが、同じ行が2回存在することはできません。チェックコード側を担当します。

重複する行を削除するにはどうすればよいですか(以下を参照)。

select * from people:

a | b
1   2
1   3
1   3
1   7
2   3
2   5
2   5
2   9

結果を次のようにします。

a | b
1   2
1   3
1   7
2   3
2   5
2   9
4

3 に答える 3

3

これは機能するはずです:

ALTER IGNORE TABLE people ADD UNIQUE (a,b);

インデックスを追加したくない場合は、これでうまくいくはずです。

DROP TABLE IF EXISTS people_old;
DROP TABLE IF EXISTS people_new;
CREATE TABLE people_new LIKE people;
INSERT INTO people_new SELECT DISTINCT * FROM people;
RENAME TABLE people TO people_old, people_new TO people;
于 2012-10-12T19:19:01.840 に答える
1

これが重複行を削除する方法です...私の例を書いて、コードに適用する必要があります。IDのActorsテーブルがあり、first_nameが繰り返されている行を削除したい

mysql> select actor_id, first_name from actor_2;
+----------+-------------+
| actor_id | first_name  |
+----------+-------------+
|        1 | PENELOPE    |
|        2 | NICK        |
|        3 | ED          |
....
|      199 | JULIA       |
|      200 | THORA       |
+----------+-------------+

200 rows in set (0.00 sec)

-次の行に同じfirst_nameがある場合は@aという変数を使用してIDを取得します(繰り返されますが、そうでない場合はnull)。

mysql> select if(first_name=@a,actor_id,null) as first_names,@a:=first_name from actor_2 order by first_name;
+---------------+----------------+
|  first_names  | @a:=first_name |
+---------------+----------------+
|          NULL | ADAM           |
|            71 | ADAM           |
|          NULL | AL             |
|          NULL | ALAN           |
|          NULL | ALBERT         |
|           125 | ALBERT         |
|          NULL | ALEC           |
|          NULL | ANGELA         |
|           144 | ANGELA         |
...
|          NULL | WILL           |
|          NULL | WILLIAM        |
|          NULL | WOODY          |
|            28 | WOODY          |
|          NULL | ZERO           |
+---------------+----------------+
200 rows in set (0.00 sec)

-重複したIDのみを取得できるようになりました。

mysql> select first_names from (select if(first_name=@a,actor_id,null) as first_names,@a:=first_name from actor_2 order by first_name) as t1;
+-------------+
| first_names |
+-------------+
|        NULL |
|          71 |
|        NULL |
 ...
|          28 |
|        NULL |
+-------------+
200 rows in set (0.00 sec)

-最後のステップ、削除しましょう!

mysql> delete from actor_2 where actor_id in (select first_names from (select if(first_name=@a,actor_id,null) as first_names,@a:=first_name from actor_2 order by first_name) as t1);
Query OK, 72 rows affected (0.01 sec)

-次に、テーブルを確認しましょう。

mysql> select count(*) from actor_2 group by first_name;
+----------+
| count(*) |
+----------+
|        1 |
|        1 |
|        1 |
...
|        1 |
+----------+
128 rows in set (0.00 sec)

それは動作します、質問があれば私に返信してください

于 2012-10-12T19:22:14.810 に答える
1

両方の列が重複している可能性がありますが、同じ行が2回存在することはできません

これは、実装していないテーブルの制約です。制約はunique indexにあり(a,b)ます。インデックスがあれば、重複はありません。

IMHOの最善のアプローチは、テーブルに一意のインデックスを追加し、一時テーブルを使用して最初に重複を削除することです。

  1. 人をコピーするperson_temp
  2. からすべて削除person
  3. に一意のインデックスを追加するperson
  4. unique a,bからperson_temp`人にコピーします。
于 2012-10-12T21:34:29.277 に答える