2015-03-19 153 views
2

我正在建立一个网站,接受用户输入关键字和输出匹配的数据。例如,如果用户指定关键字为'Restaurant pizza',那么我的数据库应该输出这样的记录。如何将关键字与SQL查询匹配?

我现在的表有一个称为category列,五列从keyword1命名keyword5其中包含他们的专业领域,即“比萨”,“鸡”或“烧烤”等

但我不知道怎么样编写SQL查询,因为用户可以按照任何顺序输入关键字:首先是类别,或者先是专用区域。

所以这样的查询一定会返回任何结果(假设用户输入“餐厅的比萨”查询):

SELECT * 
    FROM message 
WHERE category LIKE 'Restaurant pizza' 
OR  keyword1 LIKE 'Restaurant pizza' 
OR  keyword2 LIKE 'Restaurant pizza' 

我想这将是一个坏主意分裂输入关键字成词,然后运行中的每一个字数据库的WHERE子句。但我真的不知道如何实现我的目标。

另外,请你给我一些关于如何在这种情况下建立索引的建议?

+0

你好,你需要在'LIKE'语句中使用'%'例子:SELECT * FROM message WHERE category LIKE'%Restaurant pizza%'OR keyword1 LIKE'%Restaurant pizza%'OR keyword2 LIKE'%Restaurant pizza %' – PKirby 2015-03-19 06:30:50

+0

如果用户可以按任意顺序输入。然后,您将不得不拆分并在查询中运行输入的每个单词。如果你不想这样做,你将不得不通知用户在进入之前按特定的顺序进行。它们中的任何一个。不能做他们两个。 – 2015-03-19 06:32:44

+0

@PKirby,我想你误解了。在OP中给出的“餐厅比萨饼”的例子中,餐厅将是类别,比萨饼将是关键字。 '%Restaurant pizza%'将会寻找那些在同一列中的人。此外,OP还表示可以让用户以任何顺序输入,例如“Pizza Restaurant”。 – 2015-03-19 06:36:46

回答

0

您应该categorykeywords列上创建FULLTEXT指数,那么当查询数据爆炸由定界符(空格字符)查询字符串,然后创建查询类似:

SELECT * FROM items 
    WHERE 
    MATCH (category,keyword1,keyword2,keyword3,keyword4,keyword5) 
    AGAINST ('pizza') 
    AND 
    MATCH (category,keyword1,keyword2,keyword3,keyword4,keyword5) 
    AGAINST ('restaurant'); 
0

你可以试试这个:

SELECT * 
FROM message 
WHERE `category` LIKE '%Restaurant%' 
AND (`keyword1` IN ('Pizza','chicken','bbq') 
OR `keyword2` IN ('Pizza','chicken','bbq'))