-3

我有一张这样的表tbl_scripts

 allowed_group_ids
+-----------------+
 12343,12343,21342

我需要从这个字符串中删除一个组 id,例如 12343。设置delete_group_id12343,下面的查询似乎可以正常工作:

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

我知道我应该规范化表,但目前我无法更改我的数据库结构,所以我试图让它以这种方式工作。如何使我的查询使用单个值?

4

4 回答 4

0

我认为这应该做你正在寻找的:

UPDATE tbl_scripts
SET allowed_group_ids =
  TRIM( both ',' from
  REPLACE(
    REPLACE(
      CONCAT(',',
        REPLACE(allowed_group_ids, ',', ',,')
           , ','), ',12343,', '')
    , ',,', ','))
  • ,首先我加倍,,
  • 然后我,在字符串之前和,之后添加一个,以便更容易匹配要删除的组
  • 然后我,delete_group_id,用一个空字符串替换所有(用前导和尾随逗号)
  • 然后我再次全部替换,,回单,
  • 使用 TRIM,我删除了前导和尾随,
于 2013-01-16T12:10:07.240 回答
0

第一个替换搜索尾随逗号,第二个搜索前导逗号。单个组 id 没有尾随逗号。

最安全的选择是针对 field = value 的情况运行第二个查询

在任何时候这样做

REPLACE(allowed_group_ids, '$delete_group_id', '')

可能会删除部分较长的 id(例如 123456 中的 1234567 会留下 7)所以不要那样做

或者,即使对于单个 id,也始终添加尾随逗号,那么您只需要类似

REPLACE(allowed_group_ids, '$delete_group_id,', '')

添加尾随逗号是您可以在整个数据库中轻松更新的内容(作为一次性查询)

UPDATE table SET allowed_group_ids = CONCAT(allowed_group_ids, ',');

然后检查您的代码中的 insert 和 udpate 语句作用于该表

于 2013-01-16T11:53:15.547 回答
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_idthen cleanup 前导和尾随逗号的每个条目。TRIM

于 2013-01-16T11:53:25.430 回答
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']}
;
于 2013-01-16T11:53:30.630 回答