2017-05-10 4 views
0

私はCourseraのDukeによってMySQLクラスを取っています。 2週目には、乱雑なデータへの参照があり、私はここで私の質問をするだろうと思った。私の質問の範囲は、ハイフンで入力されたことを除いて、インスタンスに既に一致するテーブルの行のエントリを比較する方法です。つまり、 "ゴールデンレトリーバーミックス"は "ゴールデンレトリーバー - ミックス"と同じインスタンスです。 DISTINCT SELECT文を実行すると、両方の結果を引き出すことは望ましくありません。キャッチは、 "Golden Retriever-Airedale Terrier Mix"のエントリのように、ハイフンを列フィールドから削除するだけではなりません。これを行うためにクエリがどのように見えるでしょうか。 「ゴールデンレトリーバーミックス」と「ゴールデンレトリーバーミックス」の両方を取得するサンプルコードは以下のとおりです。ハイフネーションされた複製を削除するMySQLクエリ

SELECT DISTINCT breed, 
TRIM(LEADING '-' FROM breed) 
FROM dogs 
ORDER BY (LEADING '-' FROM breed) LIMIT 1000, 1000; 

私は私が必要と考え、 IF(REPLACE(breed,'-','') = breed) THEN DELETE breed;

は明らかにこれは私が探しています何で正しい構文ではありませんと言う文のTHEN/IFいます。あなたはほとんどそこにいる

+0

ハイフンを置き換えて同じものが2つ以上ある場合 - どのような種類のものを保持してもかまいませんか? – Bridge

答えて

0

、あなたはselect句で平野breed列を取り除くされてやるとREPLACE()

SELECT DISTINCT REPLACE(breed, '-', ' ') 
FROM dogs 

TRIM(LEADING...)TRIM()を変更する必要があるすべては、文字列の先頭にハイフンを削除しますしかし、あなたが表示したいのは、breedの別個の値で、ハイフンをスペースとして扱うことです。

編集

私は、あなたは、2つの文字列が「ゴールデンレトリバーミックス」だったと仮定して「ゴールデンレトリバーミックス」が、スペースはハイフン(「ゴールデンRetriever-ミックス」)の後に実際にあるかどうました代わりにREPLACE(breed, '-', '')

編集2

を使用することができますあなたのコメントで明確化した後、私は何が必要だと思うGROUP BY

です

ハイフンを含む文字列は、同じ文字列よりもスペースが大きいとみなされます。したがって、両方のクエリが存在する場合は、スペースを含む文字列が返されます。代わりに1つしかない場合、それはそのまま返されます

+0

これはフィールド名を出力しますが、それでもハイフンを出力したい場合はハイフンなしです。私は、ハイフンなしで別の行に等しい行を削除したいだけです。 –

+0

@BrianWiley注目、私は私の答えを改善した –

0

あなたが探しているものは、Levenshteinの距離(https://en.wikipedia.org/wiki/Levenshtein_distance)だと思います。 これは単語間の差を計算します。 "Test"と "Test1"を比較すると1文字多いので1になります。 「 - 」それもスペルミスを持つものが含まれて あなたはこれが大手を持つすべてのエントリを持ち出すだけでなく How to add levenshtein function in mysql?またはLevenshtein: MySQL + PHP

から提案された手順を使用することができます。計算された距離で結果データをフィルタリングすることができます。

パフォーマンスの問題のためにこのコードを使用したくない場合は、TRIMまたはREPLACEを使用してシンボルをフィルタし、他の文字列と比較することができます。

関連する問題