我是SQL编程的新手。
我有一个表工作,其中的字段为id
,position
,category
,location
,salary range
,description
,{{ 1}}。
我想从前端实施关键字搜索。关键字可以驻留在上表的任何字段中。
这是我尝试过的查询,但它包含很多重复的行:
refno
答案 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%'