MySQL从另一个表递归更新表

问题描述 投票:1回答:1

我有两个表,table1和table2,其中table1被更新以基于table2中的匹配字段来填充缺失(空)值,以创建更完整的table1。

我尝试了很多查询,例如

UPDATE table1 INNER JOIN table2...SET...

UPDATE table1 SET ... (SELECT)...

但是我的结果总是不完整。请注意,就列和行而言,我在两个表中都有一个更大的数据集。我只是用这个作为更简单的示例。

规则:

1) The `keyword` from table2 looks for a match in `keyword` in table1 and must accept partial matches.
2) No values can be overwritten in table1 (update null values only)
3) The lookup order is per run_order in table2.  

特定示例:

表1:

|-----|-------------------------------|----------|-----|---------|-------|                  
|t1_id|keyword                        |category  |month|age      |skill  |
|-----|-------------------------------|----------|-----|---------|-------|  
|  1  |childrens-crafts-christmas     |kids      |     |         |       |  
|  2  |kids-costumes                  |          |     |tween    |       |  
|  3  |diy-color-printable  printable |          |     |         |easy   |  
|  4  |toddler-halloween-costume-page |          |     |         |       |  
|-----|-------------------------------|----------|-----|---------|-------|

Table2:

|-----|---------|---------|----------|-----|----------|-------|
|t2_id|run_order|keyword  |category  |month|age       |skill  |
|-----|---------|---------|----------|-----|----------|-------|
|  1  |   1     |children |          |     |4-11 yrs  |       |
|  2  |   2     |printable|          |     |          |easy   |
|  3  |   3     |costume  |halloween | 10  |0-12 years|       |
|  4  |   4     |toddler  |          |     |1-3 years |       |
|  5  |   5     |halloween|holiday   | 10  |          |       |
|-----|---------|---------|----------|-----|----------|-------|

结果:

|-----|-------------------------------|----------|-----|---------|-------|                  
|t1_id|keyword                        |category  |month|age      |skill  |
|-----|-------------------------------|----------|-----|---------|-------|  
|  1  |childrens-crafts-christmas     |kids      |     |4-11 yrs |       |  
|  2  |kids-costumes                  |halloween | 10  |tween    |       |  
|  3  |diy-color-printable  printable |printable |     |         |easy   |  
|  4  |toddler-halloween-costume-page |holiday   | 10  |1-3 years|       |  
|-----|-------------------------------|----------|-----|---------|-------|  

用于模式和表数据的MySQL:

DROP TABLE IF EXISTS table1;
DROP TABLE IF EXISTS table2; 

CREATE TABLE `table1` (
  `t1_id` INT NOT NULL AUTO_INCREMENT,
  `keyword` VARCHAR(200) NULL,
  `category` VARCHAR(45) NULL,
  `gift` VARCHAR(45) NULL,
  `age` VARCHAR(45) NULL,
  `skill` VARCHAR(45) NULL,
  PRIMARY KEY (`t1_id`));

  CREATE TABLE `table2` (
  `t2_id` INT NOT NULL AUTO_INCREMENT,
  `run_order` INT NULL,
  `keyword` VARCHAR(200) NULL,
  `category` VARCHAR(45) NULL,
  `month` INT NULL,
  `age` VARCHAR(45) NULL,
  `skill` VARCHAR(45) NULL,
  PRIMARY KEY (`t2_id`));

INSERT INTO `table1` (`keyword`, `category`) VALUES ('childrens-crafts-christmas', 'kids');
INSERT INTO `table1` (`keyword`, `age`) VALUES ('kids-costumes', 'tween');
INSERT INTO `table1` (`keyword`, `category`, `skill`) VALUES ('diy-color-printable', 'printable', 'easy');
INSERT INTO `table1` (`keyword`) VALUES ('toddler-halloween-costume-page');

INSERT INTO `table2` (`run_order`, `keyword`, `age`) VALUES (1, 'children', '4-11 yrs');
INSERT INTO `table2` (`run_order`, `keyword`, `skill`) VALUES (2, 'printable', 'easy');
INSERT INTO `table2` (`run_order`, `keyword`, `category`, `month`, `age`) VALUES (3, 'costume', 'halloween', 10, '0-12 years');
INSERT INTO `table2` (`run_order`, `keyword`, `age`) VALUES (4, 'toddler', '1-3 years');
INSERT INTO `table2` (`run_order`, `keyword`, `category`, `month`) VALUES (5, 'halloween', 'holiday', 10);
mysql database
1个回答
0
投票

您可以在两个表之间使用一个喜欢的表达式和if nul()函数进行联接,以确保您不会覆盖非null值。

UPDATE table1 t1
    INNER JOIN table2 t2 ON t1.keyword like concat("%",t2.keyword,"%")
SET 
    t1.category = ifnull(t1.category,t2.category),
    t1.age = ifnull(t1.age,t2.age),
    t1.skill = ifnull(t1.skill,t2.skill);
© www.soinside.com 2019 - 2024. All rights reserved.