我有2张简历和类别。恢复表仅存储类别ID,类别表存储cat id和name。恢复表类别字段值具有逗号分隔值,例如1,4,6,9。现在的问题是我必须搜索类别表中类别为id 6的关键字酒店管理。这样做的查询是什么?请任何人帮忙。
SELECT * FROM resumes t1 LEFT JOIN resumes_category AS t2 ON t2.`id` = t1.`category`
WHERE (
t1.name LIKE '%test%'
OR t1.keywords LIKE '%test%'
OR t1.description LIKE '%test%'
)
除此查询外,我还要搜索简历类别关键字酒店,但简历表只有类别ID。
答案 0 :(得分:2)
您所描述的是多对多关系。
在关系数据库中,只能使用所涉及的两个表来表达多对多关系。您必须使用所谓的链接表将多对多分解为2个一对多关系。
您的表格将成为以下内容:
+---------------------+ +---------------------+ +---------------------+
| resumes | | categories | | resumes_categories |
+---------------------+ +---------------------+ +---------------------+
| resume_id (PK) | | category_id (PK) | | resume_id (PK,FK) |
| other_fields | | name | | category_id (PK,FK) |
+---------------------+ | keyword | +---------------------+
| description |
+---------------------+
使用此表格布局,您的查询变得相对容易:
SELECT resumes.*, categories.*
FROM resumes LEFT JOIN (resumes_categories, categories)
ON (resumes.resume_id = resumes_categories.resume_id AND
categories.category_id = resumes_categories.resume_id)
WHERE categories.name = 'test';
如果您使用当前使用的数据库布局,MySQL会有一个名为FIND_IN_SET()
的函数。它返回一个整数,表示找到的字符串的位置,或NULL
。
请注意,此功能很慢,我建议您更改数据库布局。
SELECT *
FROM resumes, resumes_category
WHERE FIND_IN_SET(resumes_category.id, resumes.category) IS NOT NULL
AND FIND_IN_SET(resumes_category.id, resumes.category) > 0
AND resumes_category.name = 'test';