如何在使用两个内部连接并将表设置为连接时在 MySQL 中使用更新语句?

Posted

技术标签:

【中文标题】如何在使用两个内部连接并将表设置为连接时在 MySQL 中使用更新语句?【英文标题】:How to use an update statement with MySQL while using two inner joins and setting a table to a concatenation? 【发布时间】:2017-12-18 22:56:25 【问题描述】:

我正在尝试将 product.keywords 设置为等于我的 category.name(s)

我有多个类别的产品。我想将每个类别名称连接到 product.keyword

例子:

SKU123 product.id 在 category.id 1、2 和 3 中。 category.name 分别是 Category 1、Category 2 和 Category 3。

Sku123 的 product.keyword 目前是“Awesome”

我想编写一个更新脚本来更新我所有的 product.keyword

...

SKU123 的 product.keyword 应该 = Awesome、Category 1、Category 2 和 Category 3

...

是的,请用逗号分隔:)

我有三张桌子。

名为“产品”的表:

    名为“id”的列

名为“category_product”的表:

    名为“product_id”的列 名为“category_id”的列

名为“类别”的表:

    名为“名称”的列 名为“id”的列

product.id = 产品编号

category_product.product_id = 产品 ID

category_product.category_id = 类别 ID

category.name = 类别名称

category.id = 类别 ID

    select p.sku,p.name,p.keywords,c.name,c.id,group_concat(concat(p.keywords,',',c.name)) as new_keywords

    from category_product cp inner join category c on cp.category_id = c.id

inner join product p on p.id=cp.product_id

    where p.keywords >'' and p.sku='CJP-250-TMG10-1874470677';

上面应该让您了解一切是如何连接的。

对不起,这只是我第二次使用这个网站。希望你们有足够的信息!

【问题讨论】:

【参考方案1】:

您的JOIN 基本上是正确的。您需要在GROUP_CONCAT(c.name) 之外执行CONCAT(p.keywords),否则您将使用每个类别名称重复原始关键字。要为每个产品执行此操作,请从 WHERE 子句中删除 p.sku 并使用 GROUP BY p.sku

UPDATE products AS p
JOIN (
    SELECT p.sku, CONCAT(p.keywords, ',', GROUP_CONCAT(c.name)) AS new_keywords
    FROM products AS p
    JOIN category_product AS cp ON p.id = cp.product_id
    JOIN category AS c ON cp.category_id = c.id
    WHERE p.keywords != ''
    GROUP BY p.sku) AS p1 ON p.sku = p1.sku
SET p.keywords = p1.new_keywords

SELECT 语句显示它将存储的内容是:

SELECT p.sku, p.name, p.keywords, CONCAT(p.keywords, ',', GROUP_CONCAT(c.name)) AS new_keywords
FROM products AS p
JOIN category_product AS cp ON p.id = cp.product_id
JOIN category AS c ON cp.category_id = c.id
WHERE p.keywords != ''
GROUP BY p.sku

【讨论】:

确保先在表的副本上进行测试 为什么 != 空白关键字?我不想在关键字字段中包含产品的类别名称吗? 我是从您的查询中得知的,其中有 WHERE p.keywords > ''。所以我假设如果那里还没有关键字,您不想将类别添加为关键字。 当我尝试更新代码时 --> 错误代码:1064。您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册,以在第 6 行的“GROUP BY p.sku”附近使用正确的语法 我在将删除转换为选择时遗漏了一行。立即尝试

以上是关于如何在使用两个内部连接并将表设置为连接时在 MySQL 中使用更新语句?的主要内容,如果未能解决你的问题,请参考以下文章

如何将一个表与另一个表连接,然后计算非空列并将它们按另外两个字段分组?

两个表连接时如何检查字段是不是为空

如何内部连接两个表?

无法对 AWS Glue 作业脚本中的两个表进行连接和查询

Android SQLite - 连接两个表并将结果呈现为列表

如何连接两个表中的数据并将结果插入到新表中?