搜索名字和姓氏,按照匹配的准确性排序

时间:2012-11-11 02:58:23

标签: php mysql search sql-like

我正在尝试在我的网站(这是一个社交网站)上构建一个简单的搜索,我想搜索在该网站上注册的所有用户,并返回一个建议列表(这是该查询的用途,建议清单)。

我要搜索的表格包含以下列:userIDfnamelname

我想搜索最后2列(2个名称),并按照有多少名称与搜索词匹配的顺序返回它们。

我将运行的查询的第一部分是:

SELECT userID, fname, lname FROM names WHERE

但其余的,我需要帮助。

修改 使用此查询进行搜索:

SELECT userID, fname, lname FROM names WHERE fname LIKE '%".$term."%' OR lname LIKE '%".$term."%'

如何订购,以便结果按照匹配项开头的结果进行排序,因此当我输入M时,它会在Mark adam >

5 个答案:

答案 0 :(得分:3)

你可以尝试

SELECT userID, fname, lname,
myRank = CASE WHEN fname = @term THEN 4 
WHEN fname like @term + '%' THEN 3
WHEN fname like '%' + @term + '%' THEN 2
ELSE.... whatever ranking you want
FROM names 
WHERE fname LIKE '%' + @term + '%' 
   OR lname LIKE '%' + @term + '%'
ORDER BY myRank DESC

答案 1 :(得分:1)

您应该考虑使用full text搜索名称。全文搜索将允许您考虑匹配中的相似性。

答案 2 :(得分:0)

类似的东西:

where fname like '%' + @searchterm + '%' or lname like '%' + @searchterm + '%'

答案 3 :(得分:0)

您可以在查询语句的末尾执行ORDER BY fname ASC(授予该语法适用于您的DB语句,它看起来像某种SQL,所以应该有类似的东西)。这将按字母顺序对名称进行排序,以便Steve在Steven之前出现(因为错过了'n')。我猜也是如果你想找到基于第一个字母或第一个字母的东西,那么你可能会使用M *,星号将是你的外卡。我希望有所帮助!

答案 4 :(得分:0)

我最近遇到了类似的问题并使用了Similarity function provided by the Microsoft Master Data Services。从那里开始,我实现了一个基于trigram function的单词。我的实施将匹配'Spongebob Squarepants'和'Squarepants,Bob'。

如果您不拥有visual studio(创建sql-server中使用的程序集所需),您还可以使用本机T-SQL实现所需的功能(即模糊字符串匹配)。可以找到一个漂亮的工具包here

更新: 注意:相似性字符串匹配对增量搜索不起作用,即“M”与“Mark”不匹配。您将不得不使用其他尝试,可能是模糊字符串匹配和分类为'开头','包含'等的组合。