我应该如何用逗号完全删除数据库中的id?

时间:2013-01-16 11:45:46

标签: php mysql

我有一张表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

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

4 个答案:

答案 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,,以便更容易匹配要删除的群组
  • 然后我用空字符串
  • 替换所有,,(带有前导和尾随逗号)
  • 然后我再次将所有,替换为单,
  • 使用TRIM,我删除了前导和尾随{{1}}