在mysql字段中搜索具有逗号分隔值的关键字

时间:2010-02-17 05:41:17

标签: mysql csv

我有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。

1 个答案:

答案 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';