1

mysql dbに3つの列が含まれている場所があります

Country     State           City
US          California      Los Angeles
AU          Queensland      Brisbane
AU          Victoria        Southbank
AU          Queensland      Brisbane

mysqlクエリで重複した行を削除するにはどうすればよいですか?

DELETE FROM location WHERE country IN (
  SELECT * FROM table_name 
  GROUP BY country, state, city 
  HAVING COUNT(*) >
);

このクエリを試しましたが、うまくいきませんでした

4

4 に答える 4

4

個別の行を選択し、それらを新しいテーブルに入れます。

CREATE TEMPORARY TABLE location_temp AS SELECT DISTINCT * FROM location

テーブルの切り捨て:

DELETE FROM location;

テーブルから個別の値を入力します

INSERT INTO location(Country, State, City) SELECT Country, State, City FROM location_temp;

リソース: http://www.databasejournal.com/features/mysql/article.php/2201621/Deleting-Duplicate-Rows-in-a-MySQL-Database.htm

于 2013-08-17T11:31:59.537 に答える
3

クエリには多くの問題があります:

DELETE FROM location
where country in (SELECT *
                  FROM table_name 
                  GROUP BY country, state, city 
                  having COUNT(*)>);

例: (1) サブクエリから複数の列を返していますが、1 つの列のみと比較しています。(2) 比較の結果、番号がありません。(3) 2 つの異なるテーブルを参照しています。

データが構造化されている (行に一意の ID がない) ため、削除する行を決定するのは困難です。truncate代わりにメソッドを使用することをお勧めします。そして、すべてのテーブルに自動インクリメント ID を配置する方法を学びます。

create temporary table tmpLocation as
    select country, state, city from location;

truncate table location;

insert into location(country, state, city)
    select distinct country, state, city
    from tmpLocation;

drop table tmpLocation;

多数の削除がある大きなテーブルでは、これもより効率的です。

于 2013-08-17T11:31:41.980 に答える
1

あなたは言及するのを忘れましたcount(*)>1

DELETE FROM location
where country in (
SELECT *
FROM table_name 
GROUP BY country, state, city 
having COUNT(*)>1);

ご参考まで。ALTER IGNORE TABLEを使用して重複を削除することもできます。

このようなもの:-

ALTER IGNORE TABLE location ADD UNIQUE INDEX (COLUMN1, COLUMN2)
于 2013-08-17T11:29:08.913 に答える
1

ALTERクエリを使用して重複行を削除する必要があります

ALTER IGNORE TABLE location ADD UNIQUE INDEX index_name(Country, State, City);

または、以下のクエリ構文otherwiseを使用して重複行を削除できます

DELETE
FROM table_name
WHERE col1 IN  (  
    SELECT MAX(col1)
    FROM tab_name
    GROUP BY col1, col2, col3, ....
    HAVING COUNT(*) > 1)
于 2013-08-17T11:30:58.797 に答える