0

鉴于我的桌子

id | name
 01| Test Name
 02| Name Test
 03| Another name
 ...
 ...
 nn| Test string

我想对每个条目执行以下操作,读取第一个单词,直到一个空格,所以在这个例子中,我会读取 Test,然后,在字符串的任何位置找到所有包含 Test 的类似条目,然后继续Name另一个,以此类推。

我不想手动执行此操作,因为我必须进行大量查询,其想法是数据是从旧的 excel 电子表格中导入的,并且客户想要获得重复的名称,所以Test NameTest Something NameName Test是潜在的相似名称。

4

3 回答 3

3

您想运行一个查询,选择所有名称,将其返回给 php,然后循环遍历它,将字符串解析为单独的单词,并使用全文索引运行查询。

这里有一些东西可以帮助您入门。 http://www.databasejournal.com/sqletc/article.php/1578331/Using-Fulltext-Indexes-in-MySQL---Part-1.htm

于 2012-09-06T00:04:24.503 回答
2

这是我的数据库解决方案:

SELECT * 
FROM princess a
INNER JOIN (SELECT 
        DISTINCT CASE
            WHEN name LIKE '% %' 
                THEN SUBSTR(name, 1, LOCATE(' ', name) - 1)
            ELSE name
        END AS 'name'
    FROM princess) b ON a.name LIKE CONCAT('%', b.name ,'%')

这将找到DISTINCT名称(在空格之前),然后JOIN使用LIKE.

您也可以考虑使用INSTR(a.name, b.name)代替,b.name LIKE CONCAT('%', a.name ,'%')具体取决于您的EXPLAIN外观。

于 2012-09-06T00:24:07.280 回答
0

在 MySQL 中有大量关于如何将字符串拆分为多行的示例,例如this one

之后,您可以轻松找到完全匹配的内容。如果您想要非精确匹配,请查看SOUNDEX()

于 2012-09-06T00:15:53.707 回答