Mysql 使用来自另一个表的连接数据进行SQL更新

Mysql 使用来自另一个表的连接数据进行SQL更新,mysql,sql,Mysql,Sql,我一直迷失在这一点上,努力寻找正确的方法。希望有人知道我想做什么的好方法。 我有两个表,我想使用来自另一个表的连接数据更新其中一个表,其中ID相同。例如 表1 ItemID CategoryID 1 20 1 30 1 40 2 10 3 40 3

我一直迷失在这一点上,努力寻找正确的方法。希望有人知道我想做什么的好方法。 我有两个表,我想使用来自另一个表的连接数据更新其中一个表,其中ID相同。例如

表1

  ItemID       CategoryID
       1                20
       1                30
       1                40
       2                10
       3                40
       3                20
       4                10
       4                20
表2

  ItemID        CatIDs
       1
       2
       3
       4
我想用ItemID匹配的Table1中的所有类别ID更新Table2.CatIDs。当我这样写下来的时候,它看起来很简单,但是在尝试了内部连接、子查询等之后,正如我在网上发现的那样,我不断发现您的SQL语法中有错误

我想让表2看起来像

   ItemID        CatIDs
        1        20,30,40
        2        10
        3        40,20
        4        10,20
我尝试过内部连接和子查询,我得到的最接近的没有错误的结果是

  UPDATE Table2
  SET Table2.CatIDs = Table2.CatIDs + ", " + 
  (SELECT CategoryID FROM Table1 WHERE Table2.ItemID = Table1.ItemID)
但它似乎还没有完成,它所做的只是用相同的CATID更新四行,然后给我消息 1242-子查询返回超过1行

我相信有人会看到我的错误,并为我指出正确的方向

提前感谢

您应该意识到表1是存储此信息的正确方法。它被称为连接表或关联表。有时,出于表示的目的,您需要进行连接,但为了充分的灵活性,您需要保留连接表

您可以通过以下方式使用带有join和group的更新来执行所需操作:

通过使用group_concat尝试下面的方法,您可以获得分隔的列表,然后在表之间联接。但是存储逗号分隔的值从来都不是一个好主意

update table2 t2
join
(
select ItemID,group_concat(CategoryID) as newcat
from table1 group by ItemID
) tab on t2.ItemID = tab.ItemID        
set t2.CatIDs = tab.newcat

请不要那样做!决不,决不,决不在一列中存储多个值!谢谢拉胡尔。我看到我的子查询没有设置为任何内容。有道理。这些值存储在一起,但原始表会被另一个脚本保留,这是有原因的。谢谢你的解决方案。@user3683463,同样,存储分隔的值真的很糟糕。如果你想让自己从未来的噩梦中解脱出来,就不要这样做。你的意思是特别是逗号分隔的值,还是通常只是多个值?如果是前者,我可以用另一个角色。虽然剧本没有按我的要求完成,但仍在继续。Thanks@user3683463,我是指逗号分隔的值。干杯,戈登。原始表是为其他sql查询保留的,但这个特殊的表有一个目的,我们需要连接。谢谢你的建议。这似乎还不太管用。它只填充一个categoryID,而不是串联的。我可以用Select查询来显示它们,但当我把它设为别名并试图从中进行选择时,它似乎并不想玩游戏。上面的代码中是否有需要添加或调整的内容?Thanks@user3683463 . . . 这个问题在我看来是正确的。我无法判断您的select查询在做什么,因为我不知道它看起来像什么。
update table2 t2
join
(
select ItemID,group_concat(CategoryID) as newcat
from table1 group by ItemID
) tab on t2.ItemID = tab.ItemID        
set t2.CatIDs = tab.newcat