我是SQL编程的新手.
我有一个表的工作,其中字段是id,position,category,location,salary range,description,refno.
我想从前端实现关键字搜索.关键字可以驻留在上表的任何字段中.
这是我尝试过的查询,但它包含很多重复的行:
SELECT
a.*,
b.catname
FROM
job a,
category b
WHERE
a.catid = b.catid AND
a.jobsalrange = '15001-20000' AND
a.jobloc = 'Berkshire' AND
a.jobpos LIKE '%sales%' OR
a.jobloc LIKE '%sales%' OR
a.jobsal LIKE '%sales%' OR
a.jobref LIKE '%sales%' OR
a.jobemail LIKE '%sales%' OR
a.jobsalrange LIKE '%sales%' OR
b.catname LIKE '%sales%'
Run Code Online (Sandbox Code Playgroud)
Gre*_*reg 54
对于VARCHAR字段上的单个关键字,您可以使用LIKE:
SELECT id, category, location
FROM table
WHERE
(
category LIKE '%keyword%'
OR location LIKE '%keyword%'
)
Run Code Online (Sandbox Code Playgroud)
对于描述,您通常最好添加全文索引并进行全文搜索(仅限MyISAM):
SELECT id, description
FROM table
WHERE MATCH (description) AGAINST('keyword1 keyword2')
Run Code Online (Sandbox Code Playgroud)
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%';
Run Code Online (Sandbox Code Playgroud)
理想情况下,有一个包含字段的关键字表:
Keyword
Id
Count (possibly)
Run Code Online (Sandbox Code Playgroud)
关键字索引.在另一个表上创建一个插入/更新/删除触发器,以便在更改行时,提取每个关键字并将其放入(或替换)此表中.
您还需要一个单词表,不计入关键字(if,and,so,but,...).
通过这种方式,您可以获得想要查找关键字的查询的最佳速度,并且可以(相对容易地)实现更复杂的查询,例如"包含Java和RCA1802".
"LIKE" 查询将起作用,但它们也不会扩展.
就个人而言,我不会LIKE在ID字段或任何其他数字字段上使用字符串比较.它没有意义的搜索编号" 216 "返回16 216,216 51 3 216 087 53 216 68 ...,等等等等; 同样有薪水.
此外,如果要使用预准备语句来阻止SQL注入,则可以使用以下查询字符串:
SELECT * FROM job WHERE `position` LIKE CONCAT('%', ? ,'%') OR ...
Run Code Online (Sandbox Code Playgroud)
小智 5
我将解释我通常喜欢的方法:
首先,您需要考虑到,对于这种方法,您将牺牲内存以提高计算速度。其次,您需要拥有编辑表结构的权限。
1)添加一个字段(我通常称之为“摘要”),您可以在其中存储表中的所有数据。
该字段将如下所示:
"n-n1-n2-n3-n4-n5-n6-n7-n8-n9" 等等.. 其中 n 是一个单词
我使用正则表达式 thar 将“”替换为“-”来实现这一点。该字段是所有表数据在一个字符串中“消化”的结果。
2) 在摘要字段上使用 LIKE 语句 %keyword%:
SELECT * FROM table WHERE digest LIKE %keyword%
Run Code Online (Sandbox Code Playgroud)
你甚至可以用一个小循环构建一个查询,这样你就可以同时搜索多个关键字,如下所示:
SELECT * FROM table WHERE
digest LIKE %keyword1% AND
digest LIKE %keyword2% AND
digest LIKE %keyword3% ...
Run Code Online (Sandbox Code Playgroud)
你可以在这里的一个帖子中找到另一个更简单的选项:Match Against ...与11.9.2中的更详细帮助.布尔全文搜索
这是为了防止有人需要更紧凑的选项.这将需要在表中创建一个索引FULLTEXT,这可以很容易地完成.
有关如何创建索引(MySQL)的信息:MySQL FULLTEXT索引和搜索
在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;
Run Code Online (Sandbox Code Playgroud)
我试过多列,没有运气.即使索引中允许多个列,您仍然需要为每个列使用一个索引来与Match/Against语句一起使用.
根据您的标准,您可以使用任一选项.