我在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;
显然这不是我正在寻找的正确语法。
答案 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;它甚至包括拼写错误的那些。您可以按计算的距离过滤结果数据。
如果由于性能问题而不想要这个,您仍然可以使用REPLACE
或header {
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;
}
来过滤您的符号并将其与其他字符串进行比较。