我有一张表tbl_scripts
,如下所示:
allowed_group_ids
+-----------------+
12343,12343,21342
我需要从此字符串中删除一个组ID,例如12343.将delete_group_id
设置为12343
,以下查询似乎正常工作:
UPDATE tbl_scripts
SET allowed_group_ids =
REPLACE(
REPLACE(allowed_group_ids, '$delete_group_id,', ''),
',$delete_group_id', '')
WHERE
system_id = {$_SESSION['system_id']}
但是如果列只有一个值,则失败:
allowed_group_ids
+-----------------+
12343 <-----I'm not able to replace this with blank
我知道我应该规范化表格,但目前我无法改变我的数据库结构,所以我试图让它以这种方式工作。如何使我的查询使用单个值?
答案 0 :(得分:0)
第一个替换搜索尾随逗号,第二个替换搜索一个逗号。单个组ID没有逗号。
最安全的选项是针对field = value
的情况运行第二个查询随时执行此操作
REPLACE(allowed_group_ids, '$delete_group_id', '')
可能删除部分较长的ID(例如,1234567中的123456会留下7) 所以不要这样做
或者总是为单个id添加一个尾随逗号,那么你只需要像
这样的东西REPLACE(allowed_group_ids, '$delete_group_id,', '')
添加一个尾随逗号,可以在整个数据库中轻松更新(作为一次性查询)
UPDATE table SET allowed_group_ids = CONCAT(allowed_group_ids, ',');
然后检查代码中的insert和udpate语句作用于此表
答案 1 :(得分:0)
试试这个:
UPDATE tbl_scripts SET allowed_group_ids =
TRIM(BOTH ',' FROM REPLACE(allowed_group_ids, '$delete_group_id', ''))
WHERE system_id = {$_SESSION['system_id']}
这将删除$delete_group_id
的每个条目,然后使用TRIM
函数清除前导和尾随逗号。
答案 2 :(得分:0)
试试这个,不确定这在语法方面是否可行..
UPDATE tbl_scripts SET allowed_group_ids =
CASE WHEN INSTR(allowed_group_ids, '$delete_group_id,') > 0 THEN
REPLACE(REPLACE(allowed_group_ids, '$delete_group_id,', ''), ',$delete_group_id', '')
ELSE NULL END
WHERE system_id = {$_SESSION['system_id']}
;
UPDATE tbl_scripts SET allowed_group_ids =
CASE WHEN INSTR(allowed_group_ids, ',') > 0 THEN
REPLACE(REPLACE(allowed_group_ids + ',', '$delete_group_id,', ''), ',$delete_group_id', ''
ELSE
REPLACE(REPLACE(allowed_group_ids, '$delete_group_id,', ''), ',$delete_group_id', '')
END
AND system_id = {$_SESSION['system_id']}
;
答案 3 :(得分:0)
我认为这应该符合您的要求:
UPDATE tbl_scripts
SET allowed_group_ids =
TRIM( both ',' from
REPLACE(
REPLACE(
CONCAT(',',
REPLACE(allowed_group_ids, ',', ',,')
, ','), ',12343,', '')
, ',,', ','))
,
加倍,,
,
,在,
之后添加,delete_group_id,
,以便更容易匹配要删除的群组,,
(带有前导和尾随逗号)
,
替换为单,