MySQL 选择一个字段中的值与另一表中的值匹配的行

标签 mysql

我有下表:

  • 包含字段 job_id int、job_title varchar(50)、skill_cat_id varchar(50) 的 tbljobpost
  • tblappskills 包含字段 app_control Int、skill_cat_id Varchar(50)

tbljobpost:

+-------------------------------------+
| job_id | job_title  | skill_cat_id  |
+-------------------------------------+ 
| 1      | Programmer | 1,2,3,4,5,6,7 | 
+-------------------------------------+ 

tblappskills:

+-----------------------------+ 
| app_control | skill_cat_id  | 
+-----------------------------+ 
| 1           | 1,2,4,5,6     | 
| 2           | 1,2,3,7,4     | 
| 3           | 1,2,3,4,5,6,7 | 
| 4           | 7,1,4,5,6,2,3 |
+-----------------------------+ 

如何查询或过滤与 tbljobpost 具有相同 skill_cat_id(以逗号分隔)的 tblappskills? 结果会是这样的:

+-----------------------------+ 
| app_control | skill_cat_id  | 
+-----------------------------+ 
| 3           | 1,2,3,4,5,6,7 | 
| 4           | 7,1,4,5,6,2,3 |
+-----------------------------+

最佳答案

您的解决方案不适合first normal form

您应该将技能类别存储在单独的单元格中,如下所示:

+----------------------------+
| app_control | skill_cat_id |
+----------------------------+
| 1           | 1            |
| 1           | 2            |
| 2           | 1            |
| 4           | 4            |
+----------------------------+ 

然后,您就可以轻松JOIN表并选择与所需值匹配的行。 app-control-id 在表中出现多次并不重要。但是,如果您决定将其他数据放入该表中,则应该在单独的表中进行以避免冗余,如下所示:

您的新表(包含有关 app-control 的详细信息)与我上面提到的表 1 : (0..N) 相关。这很难解释,但很容易设计。如果你研究一下上面提到的范式,你就会很容易理解这一点。

关于MySQL 选择一个字段中的值与另一表中的值匹配的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7565442/

相关文章:

mysql - 高效的 MySQL 搜索

php - preg_match 提取标识符和别名

mysql替换重音字符

mysql - 使用 IF-THEN-ELSE 的触发器语法错误

php - 我可以在 PHP 中混合使用 MySQL API 吗?

MySQL 枚举字段按索引插入

php - 我必须编写两条 SQL 语句才能更新一条记录,有更好的方法吗?

php - Laravel Eloquent 检查先前的急切加载关系

mysql - 重定向tomcat端口号后无法访问phpmyadmin

mysql - 从数据库中选择三个序列