如何在MySQL中使用LIKE和任意字序?

时间:2009-11-27 13:02:25

标签: sql mysql

我需要使用LIKE关键字或其他类似的运算符来实现此目的:

在数据库中,名称和姓氏存储为一列,它按surname name的顺序排列(例如“Doe John”)。

我有一个搜索栏,可以输入你的姓名。当我要搜索时,如果您输入name surname而不是surname name(例如,如果您输入“John Doe”),我会要求,我仍然希望显示相同的结果,就好像您已经写完了surname name

我怎样才能做到这一点?

7 个答案:

答案 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 DoeDoe 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

希望你有这个概念,它可以帮助你。