我需要使用LIKE
关键字或其他类似的运算符来实现此目的:
在数据库中,名称和姓氏存储为一列,它按surname name
的顺序排列(例如“Doe John”)。
我有一个搜索栏,可以输入你的姓名。当我要搜索时,如果您输入name surname
而不是surname name
(例如,如果您输入“John Doe”),我会要求,我仍然希望显示相同的结果,就好像您已经写完了surname name
。
我怎样才能做到这一点?
答案 0 :(得分:9)
如果您的表格为MyISAM
,则可以在这两个字段上创建FULLTEXT
索引:
CREATE FULLTEXT INDEX ON mytable (name, surname)
并发出此查询:
SELECT *
FROM mytable
WHERE MATCH(name, surname) AGAINST ('+John +Doe' IN BOOLEAN MODE)
这将返回John Doe
和Doe John
。
在MyISAM
表上,即使不创建索引,此查询也会起作用,但是,在这种情况下,它会慢得多。
<强>更新强>
即使你在一个字段中有名字和姓氏,这也会有效:
CREATE TABLE t_name (id INT NOT NULL PRIMARY KEY, name VARCHAR(200) NOT NULL) ENGINE=MyISAM;
INSERT
INTO t_name
VALUES
(1, 'John Doe'),
(2, 'Doe John');
SELECT *
FROM t_name
WHERE MATCH(name) AGAINST ('+John +Doe' IN BOOLEAN MODE);
1, 'John Doe'
2, 'Doe John'
更新2:
在InnoDB
表上,您可以使用正则表达式:
SELECT *
FROM t_name
WHERE name RLIKE '[[:<:]]John[[:>:]]'
AND name RLIKE '[[:<:]]Doe[[:>:]]'
答案 1 :(得分:1)
试试这个:
SELECT *
FROM t_name
WHERE name LIKE '%john%' AND name LIKE '%doe%';
答案 2 :(得分:0)
//in PHP
//after filtering and validating name and surname
$where = 'WHERE name = ' .$name. ' ' .$surname. ' OR name = ' .$surname. ' ' .$name;
检查两者。
答案 3 :(得分:0)
SELECT SUBSTRING_INDEX(name, ' ', -1)
SUBSTRING_INDEX(name, ' ', 1)
作为计数的负值(第3个变量)返回空间的所有内容。正值会将所有内容返回到左侧。
假设您有一个输入两个值的字段。
答案 4 :(得分:0)
您可以在空白处拆分搜索输入,并分别搜索每个单词。你必须编写一个简单的函数来生成语句。基本上,如果你要搜索:
Luke Skywalker
你得到的陈述是:
SELECT * FROM `table`
WHERE
(`name` LIKE "Luke%" OR `name` LIKE "Skywalker%")
AND
(`surname` LIKE "Luke%" OR `surname` LIKE "Skywalker%")
如果有人搜索三个单词(或仅一个单词),则每个字段有三个(或一个)LIKE语句。如果您想要不那么严格,并且只需要匹配其中一个字词,请将AND
替换为OR
。
答案 5 :(得分:0)
我不知道您使用的语言是什么,但上下文/主要想法应该保持不变。 您可以添加2个文本框,1表示名称,1表示姓氏。 然后,您应该使用LIKE查询,按该顺序搜索文本框名称和姓氏值。
编辑:
第二种方法是拆分文本框的内容并将它们保存在2个单独的字符串中。 然后使用以下内容搜索它:
SELECT * FROM <your table> WHERE names LIKE 'name1+" "+name2' OR WHERE names LIKE 'name2+" "+name1';
答案 6 :(得分:0)
试试这个
原始数据:
命名强>
Doe John
Stack Overflow
Pew Ned
记录搜索
declare @String2Search varchar(50)
set @String2Search = 'John Doe'
Sql服务器查询
select name from @t
where REPLACE(name,' ','') like '%' + REPLACE(@String2Search,' ','') + '%'
OR
SUBSTRING(name,CHARINDEX(' ',name),len(name)) + SUBSTRING(name,0,CHARINDEX(' ',name)) like '%' + REPLACE(@String2Search,' ','') + '%'
MySql查询
select name from @t
where REPLACE(name,' ','') like '%' + REPLACE(@String2Search,' ','') + '%'
OR
SUBSTRING(name,LOCATE(' ',name),LENGTH(name)) + SUBSTRING(name,0,LOCATE(' ',name)) like '%' + REPLACE(@String2Search,' ','') + '%'
注意 - 我是一个sql server的人。所以首先我在SQL SERVER中编写了查询,然后我在谷歌中检查了MYSQL中相应的函数等价,我刚刚替换了那些
喜欢
SQLSERVER ---------------------------------------------- MYSQL
SUBSTRING() ------------Equivalent----------------------- SUBSTRING()
CHARINDEX() ------------Equivalent----------------------- LOCATE()
REPLACE() --------------Equivalent----------------------- REPLACE()
LEN() --------------Equivalent----------------------- LENGTH()
在Sql Server中它运行正常。我实施的概念是我将搜索文本中的单词与名字和姓氏以及反向(姓氏和名字)相匹配
我已使用Replace函数删除charecters之间的任何空格
此语句(在sql server中)
SUBSTRING(name,CHARINDEX(' ',name),len(name)) + SUBSTRING(name,0,CHARINDEX(' ',name))
OR
在MY SQL中
SUBSTRING(name,LOCATE(' ',name),LENGTH(name)) + SUBSTRING(name,0,LOCATE(' ',name))
基本上将First和LastName转换为LastName,后跟First Name
希望你有这个概念,它可以帮助你。