如何在MySQL中实现关键字搜索?

时间:2009-04-17 08:43:37

标签: sql mysql search

我是SQL编程的新手。

我有一个表工作,其中的字段为idpositioncategorylocationsalary rangedescription,{{ 1}}。

我想从前端实施关键字搜索。关键字可以驻留在上表的任何字段中。

这是我尝试过的查询,但它包含很多重复的行:

refno

7 个答案:

答案 0 :(得分:51)

对于VARCHAR字段上的单个关键字,您可以使用LIKE

SELECT id, category, location
FROM table
WHERE
(
    category LIKE '%keyword%'
    OR location LIKE '%keyword%'
)

对于描述,您通常最好添加全文索引并执行Full-Text Search(仅限MyISAM):

SELECT id, description
FROM table
WHERE MATCH (description) AGAINST('keyword1 keyword2')

答案 1 :(得分:7)

SELECT 
    *
FROM 
    yourtable
WHERE 
    id LIKE '%keyword%' 
    OR position LIKE '%keyword%'
    OR category LIKE '%keyword%'
    OR location LIKE '%keyword%'
    OR description LIKE '%keyword%'
    OR refno LIKE '%keyword%';

答案 2 :(得分:6)

理想情况下,有一个包含字段的关键字表:

Keyword
Id
Count (possibly)

带有关键字索引。在另一个表上创建一个插入/更新/删除触发器,以便在更改行时,提取每个关键字并将其放入(或替换)此表中。

您还需要一个单词表,不计算为关键字(if,and,so,but,...)。

通过这种方式,您可以获得想要查找关键字的查询的最佳速度,并且可以(相对容易地)实现更复杂的查询,例如“包含Java和RCA1802”。

"LIKE"查询可以正常运行,但也不会扩展。

答案 3 :(得分:5)

就个人而言,我不会在ID字段或任何其他数字字段上使用LIKE字符串比较。搜索ID#“ 216 ”返回16 216 216 51,3 216 <没有意义/ b> 087,53 216 68 ......,依此类推;同样有薪水。

此外,如果要使用预准备语句来阻止SQL注入,可以使用如下的查询字符串:

SELECT * FROM job WHERE `position` LIKE CONCAT('%', ? ,'%') OR ...

答案 4 :(得分:5)

您可以在此处的帖子中找到另一个更简单的选项:Match Against..11.9.2. Boolean Full-Text Searches

中提供更详细的帮助

这是为了防止有人需要更紧凑的选项。这需要在表格中创建一个索引FULLTEXT,这很容易实现。

有关如何创建索引的信息(MySQL):MySQL FULLTEXT Indexing and Searching

FULLTEXT索引中,您可以列出多个列,结果将是一个SQL语句,其索引名为search

SELECT *,MATCH (`column`) AGAINST('+keyword1* +keyword2* +keyword3*') as relevance  FROM `documents`USE INDEX(search) WHERE MATCH (`column`) AGAINST('+keyword1* +keyword2* +keyword3*' IN BOOLEAN MODE) ORDER BY relevance;

我试过多列,没有运气。即使索引中允许多个列,您仍然需要为每个列使用一个索引来与Match / Against Statement一起使用。

根据您的标准,您可以使用任一选项。

答案 5 :(得分:4)

我将解释我以前喜欢的方法:

首先,您需要考虑到,对于这种方法,您将牺牲内存以获得计算速度。 其次,您需要有权编辑表格结构。

1)添加一个字段(我通常将其称为“摘要”),您可以在其中存储表中的所有数据。

该字段将如下所示:

“n-n1-n2-n3-n4-n5-n6-n7-n8-n9”等...... 其中n是单个字

我使用正则表达式实现这一点,用“ - ”替换“”。 该字段是所有表格数据在一个sigle字符串中“消化”的结果。

2)在摘要字段上使用LIKE语句%keyword%:

SELECT * FROM table WHERE digest LIKE %keyword%

您甚至可以使用一个小循环构建一个qUery,这样您就可以同时搜索多个关键字,如下所示:

SELECT * FROM table WHERE 
 digest LIKE %keyword1% AND 
 digest LIKE %keyword2% AND 
 digest LIKE %keyword3% ... 

答案 6 :(得分:1)

我知道这有点晚了,但我对我们的应用做的是这个。希望这会对某人有所帮助。但它对我有用:

SELECT * FROM `landmarks` WHERE `landmark_name` OR `landmark_description` OR `landmark_address` LIKE '%keyword'
OR `landmark_name` OR `landmark_description` OR `landmark_address` LIKE 'keyword%' 
OR `landmark_name` OR `landmark_description` OR `landmark_address` LIKE '%keyword%'