从另一个表更新连接信息


MySQL Update joining information from another table

我在MySQL真的很新,所以请我希望你能帮助我,因为我找不到任何相关的答案我的问题。我试图更新MySQL表中的一个字段,其中包含另一个表中的信息,到目前为止,我有这样的东西:

UPDATE item i 
SET i.brandId = (SELECT t.taxonomyId 
                 FROM taxonomy t 
                 WHERE t.taxonomyName = (SELECT b.brandName 
                                         FROM brand b 
                                         WHERE b.brandId = i.brandId 
                                         AND b.companyId = 9) 
                 AND t.taxonomyType = 'brand' 
                 AND t.companyId = 9) 
WHERE i.companyId = 9

基本上,我有一个名为brand的旧表,并将其所有信息复制到一个名为taxonomy的新表,两个表之间的唯一区别是ID(其他一切保持不变),所以我需要更新表item中的所有brandId字段从brandtaxonomy,这样我就可以保留更新ID的名称。

我的查询的问题是我得到一个错误说:子查询返回多于1行

谢谢!

编辑:

表结构如下:

brand
brandId - brandName - companyId
item
itemId - itemName - brandId - companyId
taxonomy
taxonomyId - taxonomyName - companyId 

我想你可能需要这个查询:

update item i
   set i.brandid =
       (select t.taxonomyid
          from taxonomy t
          join brand b
            on t.taxonomyname = b.brandname
           and t.companyid = b.companyid
         where b.brandid = i.brandid)

要在进行更新之前进行测试,请尝试运行以下命令,以说明将更改的内容:

select t.taxonomyid   as new_id_to_be_given,
       b.brandid      as old_id_going_away,
       t.taxonomyname,
       t.companyid
  from taxonomy t
  join brand b
    on t.taxonomyname = b.brandname
   and t.companyid = b.companyid
 order by 1

这将用与两个表之间相同的(taxonomyname和brandname)和(companyid和companyid)值相关联的taxonomyid值替换item表上的品牌。

如果这个查询仍然返回2+行,这意味着TAXONOMY或BRAND表有不止一行用于taxonomyname和companyid的唯一组合。

要诊断可能发生这种情况的地方,您可以运行以下命令(然后在解决问题后,您可以运行上述命令):

select 'taxonomy' as table_with_issue,
       taxonomyname,
       companyid,
       group_concat(taxonomyid separator ', ') as multiple_ids
  from taxonomy
 group by taxonomyname, companyid
having count(*) > 1
union all
select 'brand', brandname, brandid, group_concat(brandid separator ', ')
  from brand
 group by brandname, brandid
having count(*) > 1

子查询返回多于1行表示任意一个Select语句返回多于1行。

i.brandId不能设置多个值。有一件事你可以尝试将添加限制1:

UPDATE item i 
SET i.brandId = (SELECT t.taxonomyId 
                 FROM taxonomy t 
                 WHERE t.taxonomyName = (SELECT distinct b.brandName 
                                         FROM brand b 
                                         WHERE b.brandId = i.brandId 
                                         AND b.companyId = 9 limit 1) 
                 AND t.taxonomyType = 'brand' 
                 AND t.companyId = 9 limit 1) 
WHERE i.companyId = 9

但我会尝试找出如何添加一些东西到where子句,以确保您只返回一行。