从数据库中删除逗号分隔列表中的值

wat*_*zon 5 php mysql sql database

我的MySQL数据库中有一个名为'children'的表.在该表中有一行称为"愿望"(孩子的愿望清单项目的逗号分隔列表).我需要能够更新该列表,以便它只删除一个值.即清单= 12号普通牛仔裤,冲浪板,红袜棒球帽; 我想删除Surfboard.

我现在的查询看起来像这样

$select = mysql_query('SELECT * FROM children WHERE caseNumber="'.$caseNum.'" LIMIT 1 ');
    $row = mysql_fetch_array($select);

    foreach ($wish as $w) {
        $allWishes = $row['wishes'];
        $newWishes = str_replace($w, '', $allWishes);
        $update = mysql_query("UPDATE children SET wishes='$newWishes' WHERE caseNum='".$caseNum."'");
}
Run Code Online (Sandbox Code Playgroud)

但UPDATE查询不会删除任何内容.我该怎么做我需要的东西?

Mic*_*ski 4

使用这些用户定义的REGEXP_REPLACE()函数,您可以将其替换为空字符串:

UPDATE children SET wishes = REGEXP_REPLACE(wishes, '(,(\s)?)?Surfboard', '') WHERE caseNum='whatever';
Run Code Online (Sandbox Code Playgroud)

不幸的是,您不能只使用普通旧的REPLACE(),因为您不知道字符串“Surfboard”出现在哪里。事实上,如果“Surfboard”出现在开头或结尾,上面的正则表达式可能需要额外的调整。

也许您可以像这样删除剩余的前导和尾随逗号:

UPDATE children SET wishes = TRIM(BOTH ',' FROM REGEXP_REPLACE(wishes, '(,(\s)?)?Surfboard', '')) WHERE caseNum='whatever';
Run Code Online (Sandbox Code Playgroud)

那么这是怎么回事呢?正则表达式删除“Surfboard”以及前面的可选逗号和空格。TRIM()然后,如果“Surfboard”出现在字符串开头,则周围函数会消除可能的前导逗号。这也可能由正则表达式来处理,但坦率地说,我太累了,无法解决这个问题。

请注意,我自己从未使用过这些,也不能保证它们的有效性或稳健性,但这是一个起点。而且,正如其他人在评论中提到的那样,您确实应该将它们放在规范化的愿望清单表中,而不是作为逗号分隔的字符串。

更新

考虑更多这一点,我更偏向于强制使用内置REPLACE(),然后清除多余的逗号,其中可能会连续出现两个逗号。这是并排查找两个逗号,就好像原始列表项之间没有空格一样。如果项目已用逗号和空格分隔,请在外部调用中更改',,'为。', ,'REPLACE()

UPDATE children SET wishes = TRIM(BOTH ',' FROM REPLACE(REPLACE(wishes, 'Surfboard', ''), ',,', ',')) WHERE caseNum='whatever';
Run Code Online (Sandbox Code Playgroud)