godt du kunne prøve noget i denne retning:
dette er testopsætning:
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)
For at forklare lidt; Først krydser du begge tabeller, og det skulle resultere i et kartesisk produkt, som sådan:
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)
fra det tidspunkt skal du bare vælge rækker, der har en streng indeholdt i en anden (INSTR(permission, t2id) => kortlægning af tilladelser til id'er), du ender med dette:
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)
nu skal du bare samle resultater med 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;