2017-05-10 49 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来过滤符号并将其与另一个字符串进行比较。