0

何千行もある巨大なテーブルがあります。各行には固有のパスがあります。例えば:

electronics/samsung/tv/lcd-23384
electronics/philips/tv/lcd-12ger
etc...

問題は、最近のクエリが正しく実行されなかったため、一部のフィールドのパスが重複していることです。それで、私が知りたいのは、すべての重複を表示するために実行できるクエリはありますか? 言い換えれば、私がこれを持っている場合:

ID     | PATH 
1      | path_1
2      | path_2
3      | path_3
4      | path_3
5      | path_3
6      | path_4
7      | path_4
8      | path_5
9      | path_6

この結果が欲しい:

ID     | PATH 
3      | path_3
4      | path_3
5      | path_3
6      | path_4
7      | path_4

重複していないものはすべて削除されていることに注意してください。つまり....これらのもの:

ID     | PATH 
1      | path_1
2      | path_2
8      | path_5
9      | path_6

これを達成できる SQL クエリはどれですか?

4

4 に答える 4

4
SELECT * FROM mytable NATURAL JOIN (
  SELECT PATH FROM mytable GROUP BY PATH HAVING COUNT(*) > 1
) dupes

sqlfiddleで参照してください。


以下のコメントでリクエストした更新を実行するには:

UPDATE mytable NATURAL JOIN (
  SELECT PATH FROM mytable GROUP BY PATH HAVING COUNT(*) > 1
) dupes, (SELECT @r:=0) init
SET mytable.PATH = CONCAT(PATH, '-', @r:=@r+1);

sqlfiddleで参照してください。

于 2012-07-06T12:32:04.673 に答える
0

これを試して、必要なテーブルと列の値を置き換えてください:

SELECT YourColumn, COUNT(*) TotalCount
  FROM YourTable
 GROUP BY YourColumn
HAVING COUNT(*) > 1
 ORDER BY COUNT(*) DESC
于 2012-07-06T12:34:24.140 に答える
0

このようなクエリを使用すると、すべての重複を確認できます

SELECT * FROM YourTable WHERE Path in
  (SELECT PATH
   FROM YourTable
   GROUP BY PATH
   HAVING COUNT(*)>1)

どのような行を削除しますか?

于 2012-07-06T12:35:10.450 に答える
0

それはあなたにすべての重複した結果を与えるでしょう

select column_name, count(column_name) occurrence from table_name 
group by column_name having count(column_name) > 1;

そして、重複しない結果をすべて取得したい場合..

select column_name, count(column_name) occurrence from table_name 
group by column_name having count(column_name) = 1;
于 2012-07-06T12:41:48.140 に答える