MYSQL 查询使用 CONTAINS 更新字段

标签 mysql

我想在 mySQL 中进行查询,如果“departments_handling_the_process”字段中包含“departments_handling_the_process”字段中的“departments_handling_the_process”字段,则需要使用 process_table 的“process_name”中的串联内容更新 Department_table 的“processes_handled”。

这就是我的问题:

department_table    

department_name | processes_handled  
Department 1    | Process A; Process B; Process D;  
Department 2    | Process A; Process C: Process E; Process G;  
Department 3    | Process C; Process D; Process F 




process_table   

process_name    | departments_handling_the_process  
Process A   | Department 1; Department 2  
Process B   | Department 1  
Process C   | Department 2; Department 3  
Process D   | Department 1; Department 3  
Process E   | Department 2  
Process F   | Department 3  
Process G   | Department 2  

我当前的更新语句如下所示:

UPDATE department_table,process_table
SET processes_handled= (SELECT GROUP_CONCAT(`process_name SEPARATOR '; ')
                        FROM process_table
                        WHERE CONTAINS(process_table.departments_handling_the_process, department_table.department_name))

WHERE CONTAINS(process_table.departments_handling_the_process, department_table.department_name)
;

我希望你能帮我修正我的陈述。谢谢,还有更多的力量!

最佳答案

基于此评论的假设:

Okay, but your question is not yet clear to me. What's the desired result? It seems to me, that the process_handled column in department_table is already the desired result. Or is it empty right now?

示例数据:

CREATE TABLE department
    (`department_name` varchar(12), `processes_handled` varchar(43))
;


INSERT INTO department
    (`department_name`, `processes_handled`)
VALUES
    ('Department 1', ''),
    ('Department 2', ''),
    ('Department 3', '')
;


CREATE TABLE process
    (`process_name` varchar(9), `departments_handling_the_process` varchar(26))
;

INSERT INTO process
    (`process_name`, `departments_handling_the_process`)
VALUES
    ('Process A', 'Department 1; Department 2'),
    ('Process B', 'Department 1'),
    ('Process C', 'Department 2; Department 3'),
    ('Process D', 'Department 1; Department 3'),
    ('Process E', 'Department 2'),
    ('Process F', 'Department 3'),
    ('Process G', 'Department 2')
;

解决方案/更新声明:

update
department
set processes_handled = (select group_concat(process_name separator '; ')
                       from process where find_in_set(department_name, replace(departments_handling_the_process, '; ', ',')) != 0);

结果:

select * from department;

| DEPARTMENT_NAME |                          PROCESSES_HANDLED |
|-----------------|--------------------------------------------|
|    Department 1 |            Process A; Process B; Process D |
|    Department 2 | Process A; Process C; Process E; Process G |
|    Department 3 |            Process C; Process D; Process F |

说明:

MySQL 中没有 contains 函数。请改用 find_in_set()。另请注意,您必须将 ; 替换为 , ,以便 find_in_set() 正常工作。您可能会遇到更多这样的“陷阱”。有些您会注意到,有些您可能不会(立即)注意到。以下是省略 replace() 函数时的输出:

| DEPARTMENT_NAME |    PROCESSES_HANDLED |
|-----------------|----------------------|
|    Department 1 |            Process B |
|    Department 2 | Process E; Process G |
|    Department 3 |            Process F |

因此,请为繁重的测试和调试做好准备。此外,在其他情况下,您可能被迫编写一个函数来拆分逗号分隔的列并将其分布在多行中。 stackoverflow 上有足够多的例子,这是唯一的选择。所以再一次(但这次是最后一次),你在这个数据库设计上将会遇到很多麻烦。

  • 了解有关所用函数的更多信息 here
  • 看到它在 中实时运行 sqlfiddle

关于MYSQL 查询使用 CONTAINS 更新字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23804293/

相关文章:

mysql - 使用 where 条件将表数据从一个数据库复制到另一个数据库

java - 如何保护 MySQL 用户名和密码不被反编译?

php - 如何强制 PHP 读取换行符并返回 <br>

mysql - 如何拉取数据

mysql - 在日期字段中插入空值的兼容性查询

mysql - 无法在 Doctrine 中为原始 SQL 设置参数

mysql - 如何根据另一个表中的数据从一个表中选择数据

mysql - 1 个表的 3 个外键

mysql - 如何使聚合查询返回空集而不是 NULL 行?

php - MySQL选择时间分组,其中时间戳从具有时区差异的不同行重叠