我有一个mysql代码,您可以在其中搜索多个单词并显示可能的结果
员工表
ID firstname lastname bandname
------------------------------------
1 John Lennon Beatles
2 Paul Mccartney Beatles
3 Ringo Starr Beatles
4 George Harrison Beatles
在这里输入“John Paul”时,结果是John Lennon和Paul Mccartney
查询
set @search = 'George Ringo';
SELECT *
FROM employee
WHERE @search LIKE CONCAT('%',id,'%')
OR @search LIKE CONCAT('%',firstname,'%')
OR @search LIKE CONCAT('%',lastname,'%');
set @search = '1 Paul Starr';
SELECT *
FROM employee
WHERE @search LIKE CONCAT('%',id,'%')
OR @search LIKE CONCAT('%',firstname,'%')
OR @search LIKE CONCAT('%',lastname,'%');
但现在的问题是当我输入“Geor”或“Pau”时没有结果。
答案 0 :(得分:1)
我认为你混淆了列名和搜索值。你能试试吗?
SELECT *
FROM employee
WHERE id LIKE CONCAT('%', @search, '%')
OR firstname LIKE CONCAT('%', @search, '%')
OR lastname LIKE CONCAT('%', @search, '%')
在您的情况下,LIKE %keyword%
和REGEXP ('keyword')
都会产生相同的结果。我想提供有关TEXT SEARCH
的更多信息。
专业人员:很多人都知道,这是通过索引扫描搜索的。所以它很快。 缺点:但是,这不是OP想要的。只搜索前缀匹配。
专业人士:可以搜索包含“关键字”的任何值,缺点:这很慢。
专业人员:这提供了强大的正则表达式,例如引用Regexp to validate URL in MySQL搜索网址模式。 缺点:这很慢。
专业人员:是的。它超快,缺点:只有MyISAM支持FTS。 (例外,在MySQL 5.6中,InnoDB可以使用FTS。请参考http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html)
与Solr,ElasticSearch,Sphinx集成......
专业人士:非常快。 缺点:但很难使用。很少有引用而不是MySQL FTS。有一点延迟可以搜索新插入或更新的值。
我已经测试过显示每种搜索方法需要多长时间。但搜索引擎尚未经过测试。使用MySQL 5.5,MyISAM(检查FTS)。 search_test中有超过15M的记录。
LIKE'robert%':0.00秒
LIKE'%robert%':9.73秒
REGEXP('robert'):9.16秒
MATCH(值)反对(' robert '在布尔模式中):0.02秒
SELECT SQL_NO_CACHE COUNT(*)
FROM search_test
WHERE value LIKE 'robert%';
+----------+
| COUNT(*) |
+----------+
| 3441 |
+----------+
1 row in set (0.00 sec)
SELECT SQL_NO_CACHE COUNT(*)
FROM search_test
WHERE value LIKE '%robert%';
+----------+
| COUNT(*) |
+----------+
| 5034 |
+----------+
1 row in set (9.73 sec)
SELECT SQL_NO_CACHE COUNT(*)
FROM search_test
WHERE value REGEXP ('robert');
+----------+
| COUNT(*) |
+----------+
| 5034 |
+----------+
1 row in set (9.16 sec)
SELECT SQL_NO_CACHE COUNT(*)
FROM search_test
WHERE MATCH(value) Against('*robert*' IN BOOLEAN MODE)
+----------+
| COUNT(*) |
+----------+
| 3505 | <= not 5034, maybe stopword matters? I'm not sure. sorry.
+----------+
1 row in set (0.02 sec)
答案 1 :(得分:0)
我找到了答案。我用了REGEXP
WHERE field1 REGEXP(@search)
OR field2 REGEXP(@search)
OR field3 REGEXP(@search