使用CONTAINS更新字段的MYSQL查询

使用CONTAINS更新字段的MYSQL查询,mysql,Mysql,我想在mySQL中做一个查询,如果部门名称包含在“部门处理”字段中,我需要用流程表的“流程名称”中连接的内容更新部门表的“流程处理” 我的问题是这样的: department_table department_name | processes_handled Department 1 | Process A; Process B; Process D; Department 2 | Process A; Process C: Process E; Process G

我想在mySQL中做一个查询,如果部门名称包含在“部门处理”字段中,我需要用流程表的“流程名称”中连接的内容更新部门表的“流程处理”

我的问题是这样的:

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)
;
我当前的update语句如下所示:

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)
;

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

基于此评论的假设:

好吧,但我还不清楚你的问题。期望的结果是什么?在我看来,department_表中的process_handled列已经是期望的结果。还是现在它是空的

样本数据:

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中没有
包含
函数。改为使用
find_in_set()
。还要注意,您必须替换
进行编码,以便
在集合中查找()
正常工作。你可能会遇到更多这样的“陷阱”。有些你会注意到,有些你可能不会(立刻)。以下是省略
replace()
函数时的输出:

| DEPARTMENT_NAME |    PROCESSES_HANDLED |
|-----------------|----------------------|
|    Department 1 |            Process B |
|    Department 2 | Process E; Process G |
|    Department 3 |            Process F |
因此,要为繁重的测试和调试做好准备。另外,在其他情况下,您可能被迫编写一个函数来拆分逗号分隔的列并将其分散到多行。这里有足够多的stackoverflow示例,其中这是唯一的选项。因此,再次(但这次是最后一次),您将在数据库设计方面遇到很多麻烦

  • 了解更多有关所用函数的信息
  • 现场观看它的工作

请阅读:感谢您的回复!不过,我对数据库列中的分隔列表没有问题。我感谢您的关注,先生,但我仍然需要有关当前情况的帮助,而不是有关分隔列表的帮助。谢谢我不想把这变成一场讨论,但因为你似乎没有领会我的观点:使用分隔列表是一个丑陋的混乱,很难处理。使用它们的原因只有两个。1.谁也不知道。2.在非规范化维度的高性能数据仓库中。甚至这种情况也相当罕见。事实上,你还没有得到答案,这可能是一场噩梦的结果。重新设计你的数据库,你会惊讶于你的任务通常是多么容易解决。恕我直言,我相信你所说的都是真的(我会记住)。然而,我仍然想得到手头问题的答案,不管当前的设置是否是一场噩梦。非常感谢!非常感谢你。我使用以下用户定义的函数来分隔分隔的字符串:创建函数SPLIT_STR(x VARCHAR(255),delim VARCHAR(12),pos INT)返回VARCHAR(255)返回REPLACE(SUBSTRING(SUBSTRING_INDEX(x,delim,pos),LENGTH(SUBSTRING_INDEX(x,delim,pos-1))+1,delim“”);