MySQL查询删除带连字符的重复项

时间:2017-05-10 07:43:46

标签: mysql if-statement delete-row

我在Coursera上参加Duke的MySQL课程。在第二周,有人提到凌乱的数据,我想我会在这里问我的问题。我的问题的范围将是如何比较已经匹配实例的一行表中的条目,除了它是用连字符输入的,即" Golden Retriever Mix"是与#34; Golden Retriever-Mix"相同的实例。当我运行DISTINCT SELECT语句时,我不希望它同时提取两个结果。问题是,我们不能只从列字段中删除所有连字符,因为我们仍然希望它们例如用于输入" Golden Retriever-Airedale Terrier Mix"。查询如何查找这样做。拉入" Golden Retriever Mix"的示例代码和" Golden Retriever- Mix"在下面。

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;

显然这不是我正在寻找的正确语法。

2 个答案:

答案 0 :(得分:0)

您几乎就在那里,您需要做的就是摆脱breed条款中的简单select列,并使用TRIM() <更改REPLACE() < / p>

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

TRIM(LEADING...)会删除字符串开头的连字符,但是要显示的是breed的不同值,将连字符视为空格。

修改

我假设这两个字符串是&#34; Golden Retriever Mix&#34;并且&#34; Golden Retriever-Mix&#34;,但如果连字符后面有一个空格(&#34; Golden Retriever- Mix&#34;),你可以使用REPLACE(breed, '-', '')代替< / p>

修改2

在您的评论中澄清之后,我认为您需要的是GROUP BY条款

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

任何带有hypen的字符串都会被认为值高于带有空格的相同字符串,所以当这两个字符串都返回带有空格的字符串时。如果只有一个,它将按原样返回

答案 1 :(得分:0)

我认为你要找的是Levenshtein距离(https://en.wikipedia.org/wiki/Levenshtein_distance)。 这个计算单词之间的差异,例如比较&#34;测试&#34;和&#34; Test1&#34;会导致1,因为有一个字母更多。 您可以使用建议的程序 How to add levenshtein function in mysql?Levenshtein: MySQL + PHP

这不仅会显示所有具有领先优势的条目&#34; - &#34;它甚至包括拼写错误的那些。您可以按计算的距离过滤结果数据。

如果由于性能问题而不想要这个,您仍然可以使用REPLACEheader { overflow: hidden; z-index: 100; position: fixed; width: 100%; top: 0; right: 0; left: 0; background-color: #fff } nav { float: right; } nav ul { margin: 0; padding: 2.8em 2em; } nav ul li { display: inline; padding: 0 .4em; } nav ul li a { color: #222222; text-decoration: none; font-size: 20px; padding-bottom: .5em; transition: .5s color; } nav ul li a:hover { border-bottom: 3px solid #222222; } 来过滤您的符号并将其与其他字符串进行比较。