【问题标题】:UPDATE with multiple values and CONCAT更新多个值和 CONCAT
【发布时间】:2020-01-17 13:06:08
【问题描述】:

我正在尝试使用 CONCAT 将多个值添加到数据库字段中。

涉及两个表:

产品描述

+-----+------------+--------------------+
| id  |products_id | products_keywords  | 
+-----+------------+--------------------+-
| 123 | 1          |  something         | 
| 124 | 2          |  somethingelse     | 
+-----+------------+--------------------+-

products_spare

+-----+------------+--------------------+
| id  |spare_id    | products_name      | 
+-----+------------+--------------------+-
| 222 | 2          |  something to add  | 
| 223 | 2          |  something to add 2| 
+-----+------------+--------------------+-

我的更新查询如下所示:

UPDATE products_description pd
LEFT JOIN products_spare ps
ON pd.products_id = ps.spare_id
SET pd.products_keywords = CONCAT(pd.products_keywords," ",ps.products_name)

所以“要添加的东西”和“要添加的东西 2”都应该进入 products_keywords 字段中表 products_description 的第二行。但只有一个。我想我在这里做了一些愚蠢的错误。

【问题讨论】:

  • 你确定要走这条路吗?
  • 我不确定我是否理解你的问题。
  • 这违反了 3NF - RDBMS 的基础

标签: mysql sql-update concat


【解决方案1】:

UPDATE ... JOIN ... 有多个匹配行时,这是一个众所周知的问题;通常,只会发生一次更新。

您可以通过使用group_concat() 在子查询中预先聚合每个备件的产品名称,然后加入来解决此问题。

UPDATE products_description pd
INNER JOIN (
    SELECT spare_id, GROUP_CONCAT(products_name separator ' ') products_names
    FROM products_spare 
    GROUP BY spare_id
) ps ON pd.products_id = ps.spare_id
SET pd.products_keywords = CONCAT(pd.products_keywords, ' ', ps.products_names)

旁注:

  • 您可能需要INNER JOIN 而不是LEFT JOIN(当没有匹配的记录时,没有什么可更新的)

  • 对字符串使用单引号而不是双引号:这是 SQL 标准

【讨论】:

  • 你成就了我的一天。非常感谢。我几乎就在那里,因为我开始玩弄子查询。如果现在我的 products_keywords 中有重复的字符串怎么办?有没有办法预先避免这种情况,还是我必须通过 PHP 解决这个问题?当我说重复时,我的意思是“要添加的东西”是重复的。如果我只想添加一次“要添加的内容”+“2”怎么办?
  • @fetz_braun: group_concat() 支持 distinct,所以:GROUP_CONCAT(DISTINCT product_name SEPARATOR ' ')
  • 好的,谢谢。我是这么想的。但不幸的是,如果这些值与我的示例中的值一样,这无济于事。尽管如此,我还是会在我的领域中“添加一些东西来添加 2”。因为 DISTINCT 只会检查条目是否相同。我会尝试找到一个 php 函数来“清理”它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 2013-05-09
  • 2014-10-09
  • 2023-03-10
  • 2022-01-16
  • 2014-04-18
相关资源
最近更新 更多