我现在正在解决以下情况: 在我的数据库表中,我有名称和姓氏的列。
在我的页面上,我有搜索人员的输入,我正在努力解决问题,如何在数据库中搜索存储在两列中的名称,并将名称作为字符串("Joe Green"
)。< / p>
例如,在数据库中我有以下内容:
Joe New
Joe Blue
Joe Green
Joe Francois Green
什么是最好的方法,这个问题怎么解决?我目前正在使用MySQL数据库和Rails 3。
编辑:谢谢各位回复,但我不知道,如何使用Rails 3表示法进行查询,是否可以使用“concat”?答案 0 :(得分:6)
如果您的数据库表引擎 myISAM ,请使用 FULLTEXT search
首先按
创建 FULLTEXT 索引CREATE FULLTEXT INDEX fx_name ON pages (name, surname)
然后使用以下查询来检索所需数据
SELECT *
FROM table
WHERE MATCH(name,surname) AGAINST ('keyword' IN BOOLEAN MODE)
替代方案:使用CONCAT
首先创建索引
CREATE INDEX users_firstandlast ON users(name, surname);
option1:重复CONCAT
子句中的WHERE
(因为AS不会创建可在WHERE子句中使用的名称):
SELECT CONCAT(name, ' ', surname) as fullname
FROM users
WHERE CONCAT(name, ' ', surname) LIKE '%joe green%';
选项2:
SELECT CONCAT(name, ' ', surname) as fullname
FROM users
WHERE name LIKE '%joegreen%' or surname LIKE '%joegreen%';
<强> More information 强>
答案 1 :(得分:1)
一种方法是:
*将用户输入分为单词
*搜索名称和姓氏列中的每个单词
答案 2 :(得分:1)
首先使用split函数拆分字符串
namearr = name.split
namestr = ""
namearr.each do |i|
namestr = namestr + i
end
然后使用查询中的值
stmt =“select * from mytable where CONCAT(firstname,surename)=”+ namestr
答案 3 :(得分:1)
你可以使用我不推荐的sql server全文搜索,因为性能非常差,或者使用更强大的lucin .net,她是一些链接: http://incubator.apache.org/lucene.net/
http://msdn.microsoft.com/en-us/library/ms142571.aspx
如果有帮助则标记为已回答:)
答案 4 :(得分:1)
如果您已经在输入和数据库之间的接口上使用了什么语言(由于Rails通常与Ruby相关联,我认为你的意思是这样),这很明显会很简单。 ....
SELECT *
FROM yourtable
WHERE CONCAT(name, ' ', surname)
LIKE CONCAT('%',REPLACE(?,' ', '%'),'%')
ORDER BY LEVENSTEIN(CONCAT(name, ' ', surname), ?)
(其中'?'由搜索字符串替换,levenstein function is described here)
性能会很差 - 更好的解决方案是将字符串Ruby拆分并尝试不同组合的匹配。