【问题标题】:Mysql replace field from another table's field [duplicate]Mysql从另一个表的字段替换字段[重复]
【发布时间】:2013-05-24 01:35:32
【问题描述】:

选择查询时,我需要用 Table2 的值替换 Table1 的字段值。

例如:

表1:

Org                  Permission
--------------------------------------
Company1             1,3,7
Company2             1,3,8

表2:

Permission          Permission
--------------------------------------
1                   Read
3                   Write
7                   Execute
8                   Delete

我需要这样的:

Org                  Permission
--------------------------------------
Company1             Read,Write,Execute
Company2             Read,Write,Delete

【问题讨论】:

标签: mysql sql


【解决方案1】:

自从你的帖子在 Oracle 中被标记后,我一直在关注它:D

在 oracle 中,它以多种可能的方式寻找,但在 mysql 中,您必须借助程序来遵循它:

架构:

create table table1 (org varchar(50), permission_id varchar(50));
create table table2 (permission_id int, permission_name varchar(50));

insert into table1 values ('Company1','1,3,7'),('Company2','1,3,8');
insert into table2 values (1,'Read'),(3,'Write'),(7,'Execute'),(8,'Delete');

程序:

    DELIMITER $$

DROP PROCEDURE IF EXISTS `Update_Table_data`$$

CREATE PROCEDURE `Update_Table_data`()
BEGIN
    declare max_row int;
    declare p1 int;
    Set p1 = 0;
    SET max_row = (SELECT max(@i:=@i+1) AS row_num FROM table2 AS t,(SELECT @i:=0) AS foo);

    label1: LOOP
    set p1 = p1 + 1;
    IF p1 <= max_row THEN
        UPDATE Table1
        SET permission_id = 
        replace(permission_id, (select permission_id from 
                    (SELECT @i:=@i+1 AS row_num ,t.* FROM table2 AS t,(SELECT @i:=0) AS foo) a
                    where row_num = p1), 
            (select permission_name from 
            (SELECT @i:=@i+1 AS row_num ,t.* FROM table2 AS t,(SELECT @i:=0) AS foo) a
            where row_num = p1));       
        Iterate label1;
    END IF;    
        LEAVE label1;
    END LOOP label1;
    -- SET @x = p1;
    END$$

DELIMITER ;

然后打电话更新你的价值观:

call Update_Table_data;

希望对你有帮助:)

【讨论】:

    【解决方案2】:

    初始数据见SQLFiddle,这是结果数据SQLFiddle

    UPDATE 
        organization
    SET 
        permisson = (SELECT 
                       GROUP_CONCAT(VALUE) 
                     FROM 
                      ( SELECT 
                          org,
                          SUBSTRING_INDEX(permisson,',',1) AS `permisson`
                        FROM 
                          organization 
    
                        UNION 
    
                        SELECT
                          org,
                          SUBSTRING_INDEX(SUBSTRING_INDEX(permisson,',',2),',',-1) AS `permisson` 
                         FROM 
                        organization
    
                        UNION 
    
                        SELECT
                          org,
                          SUBSTRING_INDEX(permisson,',',-1) AS `permisson` 
                        FROM 
                          organization
                       ) AS t 
    
                       JOIN 
    
                       permission p 
    
                       WHERE 
                        p.p_id = t.permisson AND 
                        t.org = organization.org 
                       GROUP BY org
    )
    

    【讨论】:

      【解决方案3】:

      尝试使用 REPLACE 替换您的号码。只有在您使用单个数字值作为权限时它才能正常工作。

          SQL = " SELECT Org, REPLACE(REPLACE(REPLACE(REPLACE(Permission,"1","Read'"),"3","Write'"),"7","Execute'"),"8","Delete'") as Permission FROM myTable "
      

      REPLACE()

      【讨论】:

      • 投反对票有什么理由吗?不起作用?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      相关资源
      最近更新 更多