MySQL Update从另一个表加入信息

时间:2014-07-22 23:59:50

标签: php mysql sql join sql-update

我是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(其他一切保持不变),所以我需要将表格brandId中的所有item字段从brand更新为taxonomy,以便我可以保留更新ID的名称。

我的查询出现的问题是我收到一条错误消息:子查询返回超过1行

谢谢!

编辑:

表结构是:

brand
brandId - brandName - companyId

item
itemId - itemName - brandId - companyId

taxonomy
taxonomyId - taxonomyName - companyId 

2 个答案:

答案 0 :(得分:1)

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

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

这将替换item表上的brandid,其中taxonomyid值与2个表之间的相同(taxonomyname和brandname)和(companyid和companyid)值相关联。

如果此查询STILL返回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 :(得分:0)

子查询返回多于1行意味着任何一个Select语句都返回多行。

您无法将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子句中添加一些内容,以确保只返回一行。