如何在mysql中将单元格中的文本替换为另一个表中的数据

如何在mysql中将单元格中的文本替换为另一个表中的数据,mysql,Mysql,我需要你的帮助 我在MYSQL中有一个这样的表 *TABLE1* id | permission -- | ---------- a1 | 1,2,3,4,5 v2 | 2,3,4 r1 | 1,3,4,5 b4 | h7 | 4,5 *NEW_TABLE* id | permission -- | ---------- a1 | Allow,Not Allow,Disabled,WOW,Grant v2 | Not Allow,Disabled,WOW r1 | Allow,Disabled

我需要你的帮助

我在MYSQL中有一个这样的表

*TABLE1*
id | permission
-- | ----------
a1 | 1,2,3,4,5
v2 | 2,3,4
r1 | 1,3,4,5
b4 |
h7 | 4,5
*NEW_TABLE*
id | permission
-- | ----------
a1 | Allow,Not Allow,Disabled,WOW,Grant
v2 | Not Allow,Disabled,WOW
r1 | Allow,Disabled,WOW,Grant
b4 |
h7 | WOW,Grant
我还有一张桌子

*TABLE2*
id | permission
-- | ----------
1  | Allow
2  | Not Allow
3  | Disabled
4  | WOW
5  | Grant
我想选择TABLE1连接TABLE2,但是:新表应该是这样的

*TABLE1*
id | permission
-- | ----------
a1 | 1,2,3,4,5
v2 | 2,3,4
r1 | 1,3,4,5
b4 |
h7 | 4,5
*NEW_TABLE*
id | permission
-- | ----------
a1 | Allow,Not Allow,Disabled,WOW,Grant
v2 | Not Allow,Disabled,WOW
r1 | Allow,Disabled,WOW,Grant
b4 |
h7 | WOW,Grant

有没有办法在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;

问得好。在我看来,好像是字典里的一些文字很好的评论:)但我需要一个答案:(你试过什么吗?@Ofear,我也在等待答案!:@PraveenKumar如果第二个表总是一样的话,你可以删除它。我想这是最简单的解决办法。你可以像下一步那样做:首先,你必须拆分整数。然后是用例,当1被允许时的用例权限。。。但使用PHP可能更方便。执行select查询时,使用explode进行拆分,并使用case/switch解决方案或if/elseif/else解决方案。表的生成方式如下是有原因的:\n没有其他方法可以进行拆分,原因是?如果你已经规范化了你的数据库,你就不会有这样的东西。当你处理大量的数据时,这样做会更好。因为我并不每次都需要这些数据,所以我每天大约有一百万行,我有190个权限,1m*190=很多,所以如果我插入的是id(数字),而不是文本,那么表就更轻了。。。每天都有一百万行插入到历史记录表中。。1m*30(天)*190(许可)=???没有人说你必须保存字符串而不是数字。关键是,如果您规范化数据库,这仍然不应该发生。在数据库设计中,所有内容都应该具有特定的含义(功能)。所以,如果将1定义为删除用户,将2定义为创建用户,。。。这在您的应用程序中应该是一致的。您不需要字符串。@Ivica,
crs
是什么意思?不客气:)@Praveen crs只是我们给子选择(派生表)的别名,所以我们可以使用它。。。(每个派生表都必须有自己的别名)