【问题标题】:MySQL Update joining information from another tableMySQL 从另一个表更新加入信息
【发布时间】:2014-09-14 00:05:53
【问题描述】:

我是 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 

【问题讨论】:

  • 在您的更新中使用 select 语句执行 select *(将 select t.taxonomyid 更改为 select *),为什么会返回超过 1 行?列在哪里不同?当您弄清楚这一点时,您应该能够修复查询。
  • 有没有办法可以用 SELECT 替换 UPDATE 以便在不更新表的情况下查看返回的内容?
  • 是的,从更新中取出 select 查询(取出 () 中包含的所有内容并运行它(只是 select 语句),但就像我说的那样做一个 select * 以便您可以看到什么列值重复与不重复
  • 看看我在下面的回答,但我认为您可能会遇到问题,因为在 BRAND 或 TAXONOMY 中,(TAXONOMYNAME 和 COMPANYID)或(BRANDNAME 和 COMPANYID)组合具有 2 个以上的唯一 ID。这些表有什么限制吗?
  • since I couldn't find any related answer to my problem anywhere. 这很难想象,因为我在 SO 上找到了数百个相关问题和答案,以解决 MySQL 中的错误。我无法想象如果我在互联网上搜索会获得多少点击量。

标签: php mysql sql join sql-update


【解决方案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 替换为与两个表之间相同的(taxonomyname 和 brandname)和(companyid 和 companyid)值关联的 taxonomyid 值。

如果此查询仍然返回 2+ 行,这意味着 TAXONOMY 或 BRAND 表有不止一行用于分类名称和公司 ID 的唯一组合。

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

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

【讨论】:

    【解决方案2】:

    子查询返回多于 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 子句中添加一些内容,以确保您只返回一行。

    【讨论】:

    • 如果他不知道查询返回多行的原因,这可能很危险。谁说他想用第一个返回的更新它?
    • 同意。至少这将使他/她走上正确的道路,但至少他或她可以看到返回的内容然后由更新分配。我们不知道结构和数据是什么样的——没有发布架构。
    • 您好,谢谢您的回答,我尽量避免使用 LIMIT 1,因为一开始不应该有多个记录,所以我不想更新超过 10000 条记录错误的价值观。有关结构,请参阅更新后的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2013-09-10
    相关资源
    最近更新 更多