0

MySQLテーブルからダブレット(残念ながらトリプレットの場合もあります!)を削除しようとしています。私の問題は、利用可能な唯一の一意のデータが主キーであるため、ダブレットを識別するために、すべての列を考慮する必要があるということです。

ダブレットを持つすべてのレコードを識別し、それらをダブレット(主キーを含む)とともにテーブルにコピーすることができましたtemp。ソーステーブルが呼び出されtranslation、名前が。の整数の主キーがありますTranslationID。ここから先に進むにはどうすればよいですか?ありがとう!

編集利用可能な列は次のとおりです。

TranslationID
LanguageID
Translation
Etymology
Type
Source
Comments
WordID
Latest
DateCreated
AuthorID
Gender
Phonetic
NamespaceID
Index
EnforcedOwner

重複の問題は、Latest列が割り当てられた行にあります1

編集#2みなさん、ありがとうございました!WouterHの回答を使用して問題を解決したところ、次のクエリが表示されました。

DELETE from translation USING translation, translation as translationTemp
WHERE translation.Latest = 1
AND (NOT translation.TranslationID = translationTemp.TranslationID)
AND (translation.LanguageID = translationTemp.LanguageID)
AND (translation.Translation = translationTemp.Translation)
AND (translation.Etymology = translationTemp.Etymology)
AND (translation.Type = translationTemp.Type)
AND (translation.Source = translationTemp.Source)
AND (translation.Comments = translationTemp.Comments)
AND (translation.WordID = translationTemp.WordID)
AND (translation.Latest = translationTemp.Latest)
AND (translation.AuthorID = translationTemp.AuthorID)
AND (translation.NamespaceID = translationTemp.NamespaceID)
4

4 に答える 4

4

一時テーブルまたはサブクエリなしで重複を削除できます。データは同じだが異なる行をすべて削除するTranslationID

DELETE from translation USING translation, translation as translationTemp
WHERE (NOT translation.TranslationID = translationTemp.TranslationID)
AND (translation.LanguageID = translationTemp.LanguageID)
AND (translation.Translation = translationTemp.Translation)
AND (translation.Etymology = translationTemp.Etymology)
AND // compare other fields here
于 2012-04-16T14:36:48.320 に答える
2

現在のSELECTを副選択として使用してSELECTステートメントを作成し、削除する必要のあるIDの列を返すことができるようにします。次に、そのSELECTをDELETEFROMステートメントに適用します。

例(擬似コード):

SELECT1 = SELECT ... AS temp; # the table you have right now

SELECT2 = SELECT TranslationID FROM (SELECT1)

最終的なクエリは次のようになります。

DELETE FROM table_name WHERE TranslationID IN (SELECT2);

最後のクエリに副選択を含むSELECTを挿入する必要があります。

将来的にトップストップが重複する場合は、次のようにエンジンをInnoDBエンジンに変更できます。

ALTER TABLE table_name ENGINE=InnoDB;

Unique次に、TranslationIDフィールドに制約を追加します。

于 2012-04-16T14:39:05.743 に答える
0

ダブレット/トリプレットが主キーを除いて同一である場合、他のものよりも大きい主キーを持っていることを除いて、別のものと同一である一時からすべてのレコードを選択できます。これにより、各ダブレット/トリプレットの最小キー付きのレコード付きの温度が得られます。その後、これらのレコードを翻訳から削除できます。

于 2012-04-16T14:35:14.493 に答える
0

一意ではない行を識別する代わりに、有効なデータを新しいテーブルにコピーしてから、古いデータを削除して、この新しいクリーンなテーブルに置き換えようとします。

私は2つの方法を見ることができます:

  • DISTINCTSQLクエリでキーワードを使用する(ソース);
  • GROUP BYすべての列でステートメントを使用する(ソース)。
于 2012-04-16T14:38:31.423 に答える