【问题标题】:MySQL: insert into multiple columns using selects from different tablesMySQL:使用来自不同表的选择插入多个列
【发布时间】:2015-03-30 05:22:37
【问题描述】:

我有一个直接导入网站数据库的产品目录。每个产品行都列出了其类别和子类别。导入产品后,我运行此 SQL 以将不同的类别添加到数据库(用于根据其 id 创建导航 URL):

INSERT INTO categories (name) SELECT Distinct category FROM catalog_products;

现在,我想将子类别也添加到它自己的表中,但要引用它的父类别的 ID,这就是我遇到的问题。

示例:产品“SDH 20”属于“诊断”类别(“类别”表中的 ID 为 5)和子类别“血液学”。然后,“子类别”表必须将 Hematology 列为类别 ID 为 5,即类别表上“诊断”的 ID。这是我尝试过的 SQL:

INSERT INTO subcategories (name, idCategory) SELECT Distinct subcategory FROM catalog_products UNION ALL SELECT id from category WHERE categories.name = (SELECT catalog_products.category FROM catalog_products);

但我收到 "#1242 - Subquery returns more than 1 row" 错误。

是否可以使用读取 catalog_products 行的 SQL 填充“子类别”表的名称和 idCategory?如果是这样,我的 SQL 出了什么问题?

【问题讨论】:

  • 如果可以,请使用几行示例数据和预期结果或SQL Fiddle 编辑您的问题,因为这将帮助其他用户重现您的问题。

标签: mysql sql select insert


【解决方案1】:

如果您的子选择返回多行,则必须使用“IN”:

INSERT INTO subcategories (name, idCategory) 
  SELECT Distinct subcategory FROM catalog_products 
  UNION ALL SELECT id from category WHERE 
  categories.name in (SELECT catalog_products.category FROM catalog_products);
                  ^^

【讨论】:

  • 谢谢詹斯。但现在我收到错误“#1136 - 列计数与第 1 行的值计数不匹配”。所以看起来它没有找到它需要插入到表中的所有 2 个值。
  • 或许将这条 SQL 分成两部分会更容易一些。首先,像使用类别一样填充子类别: INSERT INTO subcategories (name) SELECT Distinct subcategory FROM catalog_products;之后,只更新子类别表的 idCategory。现在正在尝试使用 SQL,但这仍然有些棘手
  • @Robert 你能举一些例子,让他们看看你的 SQL 应该做什么?
【解决方案2】:

为我自己的问题想出了一个可能的答案。

这有点令人困惑,因为它同时处理 3 个不同的表,所以我尝试拆分为两个更简单的 SQL。

首先,就像类别表一样,我添加了所有不同的子类别名称,但没有其父 categoryID 字段。

INSERT INTO subcategories (name) SELECT Distinct subcategory FROM catalog_products;

现在,我使用此 SQL 使用其父类别的 categoryID 更新现有子类别,该 SQL 也针对产品目录:

UPDATE subcategories SET idCategory = (SELECT categories.id FROM categories,catalog_products WHERE subcategories.name IN (Select  catalog_products.subcategory) AND categories.name IN (Select catalog_products.category));

【讨论】:

    【解决方案3】:

    据我了解,您有两张桌子:

    CATEGORIES: id|name
    CATALOG_PRODUCTS: product|category|subcategory
    

    UNION ALL 为您提供两个不同的行,而不是您期望的两个值。试试这个:

    INSERT INTO subcategories (NAME, idCategory) 
    SELECT cp.subcategory, c.categoryID FROM catalog_products AS cp 
    JOIN categories AS c ON cp.category=c.name
    GROUP BY cp.name
    

    您只需要在 name 上加入两个表,如果您想 DISTINCT 使用 GROUP BY

    希望对您有所帮助。此 SQL 尚未测试,如有需要,请稍作修正

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      相关资源
      最近更新 更多