sql >> データベース >  >> RDS >> Mysql

セル内のテキストをmysqlの別のテーブル内のデータに置き換える方法

    さて、あなたはこれらの線に沿って何かを試すことができます:

    これはテストセットアップです:

    mysql> select * from table1;
    +------+------------+
    | id   | permission |
    +------+------------+
    | a1   | 1, 2, 3, 4 |
    | v2   | 2, 3, 4    |
    +------+------------+
    2 rows in set (0.01 sec)
    
    
    
    mysql> select * from table2;
    +------+------------+
    | id   | permission |
    +------+------------+
    | 1    | Allow      |
    | 2    | Not Allow  |
    | 3    | Disabled   |
    +------+------------+
    3 rows in set (0.01 sec)
    
    
    mysql> select id, GROUP_CONCAT(t2perm) from (SELECT t1.*, t2.id as t2id, t2.permission as t2perm from table2 t2 cross join table1 t1) crs where INSTR(permission, t2id) > 0 group by id;
    +------+--------------------------+
    | id   | GROUP_CONCAT(t2perm)     |
    +------+--------------------------+
    | a1   | Allow,Not Allow,Disabled |
    | v2   | Not Allow,Disabled       |
    +------+--------------------------+
    2 rows in set (0.00 sec)
    

    少し説明します。まず、両方のテーブルを相互結合すると、次のようなデカルト積が生成されます。

    mysql> SELECT * from table2 cross join table1;
    +------+------------+------+------------+
    | id   | permission | id   | permission |
    +------+------------+------+------------+
    | 1    | Allow      | a1   | 1, 2, 3, 4 |
    | 1    | Allow      | v2   | 2, 3, 4    |
    | 2    | Not Allow  | a1   | 1, 2, 3, 4 |
    | 2    | Not Allow  | v2   | 2, 3, 4    |
    | 3    | Disabled   | a1   | 1, 2, 3, 4 |
    | 3    | Disabled   | v2   | 2, 3, 4    |
    +------+------------+------+------------+
    6 rows in set (0.00 sec)
    

    その時点から、ある文字列が別の文字列に含まれている行を選択するだけで(INSTR(permission、t2id)=>権限をIDにマッピング)、次のようになります。

    mysql> select * from (SELECT t1.*, t2.id as t2id, t2.permission as t2perm from table2 t2 cross join table1 t1) crs where INSTR(permission, t2id) > 0;
    +------+------------+------+-----------+
    | id   | permission | t2id | t2perm    |
    +------+------------+------+-----------+
    | a1   | 1, 2, 3, 4 | 1    | Allow     |
    | a1   | 1, 2, 3, 4 | 2    | Not Allow |
    | v2   | 2, 3, 4    | 2    | Not Allow |
    | a1   | 1, 2, 3, 4 | 3    | Disabled  |
    | v2   | 2, 3, 4    | 3    | Disabled  |
    +------+------------+------+-----------+
    5 rows in set (0.00 sec)
    

    これで、結果をGROUP_CONCATで集計するだけです...

    select id, GROUP_CONCAT(t2perm) from (SELECT t1.*, t2.id as t2id, t2.permission as t2perm from table2 t2 cross join table1 t1) crs where INSTR(permission, t2id) > 0 group by id;
    


    1. グループ化されたSQL結果の各グループの最大値を持つレコードを取得します

    2. OracleのJSON_ARRAYAGG()関数

    3. PHPで年齢を見つけるには、現在の日付と時刻から日付と時刻を減算します

    4. MySQLのFORCEINDEX-どこに配置しますか?