4

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

我要搜索的表具有以下列:userID, fname, lname

我想搜索最后 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

4

5 回答 5

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
于 2012-11-11T04:41:08.500 回答
1

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

于 2012-11-11T03:09:09.747 回答
0

我最近遇到了类似的问题,并使用了 Microsoft Master Data Services 提供的 Similarity 功能。从那里开始,我实现了一个基于单词的三元组函数。我的实现将“海绵宝宝”与“鲍勃”相匹配。

如果您没有 Visual Studio(创建 sql-server 中使用的程序集所必需的),您还可以使用本机 T-SQL 实现所需的功能(即模糊字符串匹配)。可以在这里找到一个不错的工具包。

更新:注意:相似性字符串匹配在增量搜索中效果不佳,即“M”与“Mark”不匹配。您将不得不使用其他尝试,可能是模糊字符串匹配和分类为“开始于”、“包含”等的组合。

于 2012-11-11T08:57:47.363 回答
0

类似的东西:

where fname like '%' + @searchterm + '%' or lname like '%' + @searchterm + '%'
于 2012-11-11T03:01:32.463 回答
0

您可以在查询语句的末尾执行 ORDER BY fname ASC (假设该语法适用于您的 DB 语句,它看起来像某种 SQL,所以应该有类似的东西)。这将按字母顺序对名称进行排序,因此 Steve 会出现在 Steven 之前(因为缺少“n”)。我也猜想如果你想根据第一个字母或前几个字母找到一些东西,可能有一个等价物,你可以使用 M* 并且星号将是你的通配符。我希望这会有所帮助!

于 2012-11-11T04:01:09.357 回答