MySQL:使用来自不同表的选择插入多个列

时间:2015-01-30 17:00:45

标签: mysql sql select insert

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

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

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

示例:产品" SDH 20"属于类别"诊断" (在'类别'表上有一个id 5)和子类别"血液学"。 '子类别'然后,表必须将血液学列为categoryID为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"错误。

是否可以填充“子类别”' table的名称和idCategory,其中一个SQL读取catalog_products行?如果是这样,我的SQL出了什么问题?

3 个答案:

答案 0 :(得分:0)

你必须使用' 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);
                  ^^

答案 1 :(得分:0)

对我自己的问题提出了一个可能的答案。

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

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

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

现在,我使用此SQL更新现有子类别及其父类别的categoryID,同时也定位产品目录:

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));

答案 2 :(得分:0)

据我所知,你有两张桌子:

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

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

希望有所帮助。没有测试过这个SQL,如果需要的话可以稍微纠正一下