さて、あなたはこれらの線に沿って何かを試すことができます:
これはテストセットアップです:
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;