4

国の州(state_table)と都市(city_table)を含む2つのテーブルがあります

シティテーブルには、state_tableと関連付けるためのstate_idがあります

両方のテーブルにはすでにデータが含まれています。

今問題

Cityテーブルには、1つの州内の都市の複数のエントリが含まれています。また、別の都市も同じ都市名を持っている場合と持っていない場合があります

例:cityoneは、stateoneでcityテーブルに5回出現し、statetwoで2回出現します。

では、州ごとに1つの都市を保持し、残りを削除するクエリを作成するにはどうすればよいでしょうか。

スキーマは次のとおりです

CREATE TABLE IF NOT EXISTS `city_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `state_id` int(11) NOT NULL,
  `city` varchar(25) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


CREATE TABLE IF NOT EXISTS `state_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `state` varchar(15) NOT NULL,
  `country_id` smallint(5) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

これはサンプルデータです

id   state_id   city
1   1   city_one
2   1   city_two
3   1   city_one
4   1   city_two
5   2   city_one
6   3   city_three
7   3   city_one
8   3   city_three
9   4   city_four
10  4   city_five

元のテーブルには152,451行あります

4

2 に答える 2

1

state_id同じ(重複レコード)を持つ重複する都市を削除する場合はcity、 andでグループ化し、 or関数state_idを使用して削除できます。MINMAX

クエリを削除する前に、テーブルは次のようになりました

| ID | STATE_ID |       CITY |
------------------------------
|  1 |        1 |   city_one |
|  2 |        1 |   city_two |
|  3 |        1 |   city_one |
|  4 |        1 |   city_two |
|  5 |        2 |   city_one |
|  6 |        3 | city_three |
|  7 |        3 |   city_one |
|  8 |        3 | city_three |
|  9 |        4 |  city_four |
| 10 |        4 |  city_five |

次のクエリを使用して、重複するレコードを削除できます。

DELETE city_table 
  FROM city_table
  LEFT JOIN 
  (SELECT MIN(id) AS IDs FROM city_table
   GROUP BY city,state_id
  )A
  ON city_table.ID = A.IDs
  WHERE A.ids IS NULL;

上記のクエリを適用すると、テーブルは次のようになります。

| ID | STATE_ID |       CITY |
------------------------------
|  1 |        1 |   city_one |
|  2 |        1 |   city_two |
|  5 |        2 |   city_one |
|  6 |        3 | city_three |
|  7 |        3 |   city_one |
|  9 |        4 |  city_four |
| 10 |        4 |  city_five |

このSQLFiddleを参照してください

詳細についてDELETEは、MySQL の構文を参照してください。

于 2012-11-26T10:25:04.607 に答える
-1
DELETE FROM city_table 
WHERE id NOT IN 
  (SELECT MIN(id) 
   FROM city_table 
   GROUP BY state_id, city)

このクエリが遅すぎる場合は、一時テーブルを作成し、サブクエリの出力をそのテーブルに格納してから、元のテーブルを切り捨ててその内容を再入力できます。auto_increment列の値を設定する必要があるため、これは少し汚い解決策です。

于 2012-11-26T10:58:45.787 に答える