2017-05-10 146 views
0

我正在Coursera上由Duke提供MySQL類。在第二週有參考凌亂的數據,我想我會問我在這裏的問題。我的問題的範圍將是如何比較表格行中的某個條目,該條目已經與實例匹配,但是其中輸入了連字符,即「Golden Retriever Mix」與「Golden Retriever-Mix」是同一個實例。當我運行DISTINCT SELECT語句時,我不希望它拉出兩個結果。值得注意的是,我們不能僅僅從列字段中刪除所有的連字符,因爲我們仍然希望它們例如用於「黃金獵犬 - 大腿梗混合」的輸入。查詢將如何查找。下面是「金毛獵犬混合」和「金毛獵犬混合」中的示例代碼。MySQL查詢刪除連字符重複

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

我想我需要和IF/THEN聲明說 IF(REPLACE(breed,'-','') = breed) THEN DELETE breed;

顯然,這是不正確的語法,這是我所期待的。

+0

如果你有不止一個是相同的(替換連字符後) - 你介意你保留哪個變體? – Bridge

回答

0

就快,所有你需要做的是擺脫了普通breed列在你的select子句和改變TRIM()REPLACE()

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

TRIM(LEADING...)將在字符串的開頭刪除連字符。 ,但你想要顯示的是breed將連字符當作空格的不同值。

編輯

我是假設這兩個字符串是「金毛混合」和「金毛混」,但如果有連字符(「金Retriever-混合」)之後的空間實際上是,你可以使用REPLACE(breed, '-', '')代替

編輯2

澄清在您的評論之後,我想你需要的是一個GROUP BY條款

SELECT MIN(breed) 
FROM dogs 
GROUP BY REPLACE(breed, '-', ' ') 

任何帶有hypen的字符串都將被視爲值高於具有空格的同一個字符串,因此當這兩個查詢都返回帶有空格的字符串時。如果只有一個代替,它將被返回原樣

+0

當我仍然希望它輸出連字符時,右鍵會輸出字段名稱,但不帶連字符。我只想刪除沒有連字符的等於另一行的行。 –

+0

@BrianWiley注意到,我改進了我的答案 –

0

我認爲你要找的是Levenshtein距離(https://en.wikipedia.org/wiki/Levenshtein_distance)。 這一個計算單詞之間的差異,例如「Test」和「Test1」的比較結果爲1,因爲只有一個字母。 你可以使用建議的方法,從 How to add levenshtein function in mysql?Levenshtein: MySQL + PHP

這不僅帶來了其所有條目前面的「 - 」它甚至還包括與拼寫錯誤的人。您可以按計算的距離過濾結果數據。

如果您因性能問題而不想使用此功能,則仍然可以使用TRIMREPLACE來過濾符號並將其與另一個字符串進行比較。