【问题标题】:Remove item from list in MySQL database [duplicate]从 MySQL 数据库中的列表中删除项目 [重复]
【发布时间】:2018-11-20 18:27:06
【问题描述】:

我有一个 MySQL 数据库,其中有一个名为 customers 的表。在此表中,有一个名为 preferences 的字段,其内容是名称列表,可以是单个名称,也可以是组合名称。

表客户:

id   name   preferences
---------------------------------
1    John   pears,tomato sauce,bread
2    Rose   carrot cake, salad

我可以轻松地在字段首选项中添加一个新条目,执行以下操作:

UPDATE `customers` 
  SET preferences = CONCAT(preferences,',oranges') 
WHERE id=2

但现在,我想知道是否有一种简单的方法可以删除该列表中的已知项目,这并不意味着读回注册表项,使用 PHP 处理并再次保存。

我尝试使用REGEX_REPLACE 失败了,因为这个词可以在开头、中间或结尾。所以我没有成功写出一个合适的表达式来代替结果。无论如何,正则表达式可能不是正确的方法。

谢谢

【问题讨论】:

  • 最佳答案是规范列首选项
  • 规范化是什么意思?
  • 列表严格用逗号分隔?
  • 您可能想阅读normal form。它会让你在这段时间里减少很多头痛。
  • 是的,列表严格用逗号分隔:单词中不会使用逗号

标签: php mysql sql regex


【解决方案1】:

试试这个:

Update `customers`
    set preferences = TRIM(BOTH ',' FROM TRIM(BOTH 'oranges' FROM TRIM(REPLACE(CONCAT(" "',oranges'" "),' ,oranges ',''))));

它将删除',oranges'。如果,oranges 前后没有空格,则不会删除它。如您所见,它不再是RegexTRIM(BOTH 'oranges' 还会从字符串的第一个和最后一个位置删除“橙子”。

DEMO

【讨论】:

  • 我知道,但这是无效的,因为可能存在复合词,例如:“,oranges (pre-cutted)”,因此您将删除该术语的一半。
  • 我已经编辑了我的答案,请看一下
  • @Carles - 这就是您应该规范化数据库的确切原因。将您的数据库拆分为 3 个表:customerspreferencescustomer_preferences,然后通过外键链接它们。听起来很困难,但实际上很简单。
  • 谢谢@AndreiSuvorkov,我会尝试的,但无论如何我认为正确的方法是标准化。
  • MySQL REGEXP 没有前瞻和后瞻功能。
猜你喜欢
  • 2014-06-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
相关资源
最近更新 更多