如何在mysql列中已经存在的值之后插入一个值

时间:2013-03-30 14:21:23

标签: mysql vbulletin

在我的用户表中,我有一个userid列和membergroupids列。 这是我到目前为止的查询。

UPDATE `user`
SET `membergroupids`=`,100`
WHERE `userid` IN
(
  312 , 331 , 538 , 528 , 77 , 80 , 293 , 343 , 609 , 607 , 547 , 596 , 216 ,
  780 , 1 , 884 , 430 , 500 , 881 , 952 , 957 , 979 , 352 , 994 , 955 , 776 ,
  744 , 904 , 1038 , 76 , 1083 , 61 , 202 , 1001 , 1173 , 1176 , 418 , 770 ,
  1192 , 191 , 1211 , 1206 , 1247 , 402 , 423 , 584 , 1233.1282 , 167 , 1329,
  1330 , 376 , 1227 , 146 , 1113 , 1327 , 1352 , 254 , 1065 , 1406 , 1225 ,
  1230 , 1405 , 1443 , 812 , 1295 , 1510 , 1571 , 1565 , 1468 , 1349 , 1645 ,
  501 , 1312 , 1718 , 13 , 200 , 1177 , 1785 , 107 , 540 , 1591 , 1508 , 59 ,
  1867 , 222 , 1520 , 782 , 26 , 332 , 474 , 1837 , 1828 , 1431 , 1951 , 1953 ,
  1950 , 847 , 1477 , 1726 , 1669 , 1185 , 1955 , 1872 , 1926 , 1392 , 853 ,
  1892 , 2020 , 1511 , 2027 , 2197 , 2184 , 2134 , 2239 , 119 , 122
)

所以基本上,我想要做的是......我正在尝试这样做,以便查询在列成员组中添加“,100”,如果它们的用户标识是()中列出的用户标识之一。
但是,事情就是这样。所有这些用户都已在membergroupids中列出了值 例如,用户312已经在列成员组中具有这些值:
35,49,58,61,71,38,59
所以,这个查询需要对他的领域这样做:
35,49,58,61,71,38,59,100

..以及列出的所有其他用户ID。

谢谢,如果有人可以帮助我。我确定这是谷歌,但我不知道怎么说。

2 个答案:

答案 0 :(得分:2)

由于您处于无法更改架构的不幸位置,您可以通过CONCAT()

将值连接到现有值来添加值
UPDATE `user` SET `membergroupids` = CONCAT(`membergroupids`, ',100') WHERE...

这会强制,100加入每个用户,即使他们当前有空membergroupids。要考虑空的,您可以使用CASE条件:

UPDATE `users`
SET `membergroupids` =  
  /* Concatenate ,100 onto the non-empty ones */
  CASE WHEN `membergroupids` IS NOT NULL AND `membergoupids` <> '' 
    THEN CONCAT(`membergroupds`, ',100')
  /* And set the empty ones to just 100 (no comma) */
  ELSE '100'
  END
WHERE ...

在理想的世界中,用户&lt; - &gt;组成员身份将使用适当的多对多关系进行处理,其中第三个表用于将用户分配到组,具有两列:userid, groupid

答案 1 :(得分:1)

UPDATE `user` SET `membergroupids`=CONCAT(`membergroupids`, ',100') 
WHERE `userid` IN ( ... )

当然,这假设您已经在列表中至少有一个membergroupid。追加&#39;,100&#39;如果列表为空,则导致带有前导逗号的列表,这通常是不可取的。这是一个快速解决方案:

UPDATE `user` SET `membergroupids`=CONCAT_WS(COALESCE(`membergroupids`, ''), '100') 
WHERE `userid` IN ( ... )

如果成员组列表增长太长,并且不能适应varchar列的长度限制,会发生什么? &#34;抱歉,您无法加入该群组,因为我们无法存储您的群组成员资格列表。也许您想加入一些组ID较短的组,然后您可以加入更多组。&#34;

在逗号分隔的字符串中存储值列表是关系数据库的错误设计。请参阅我对Is storing a delimited list in a database column really that bad?

的回答中的陷阱描述

如果在交集表中每行存储一个成员资格,那么为用户添加成员组会更容易。然后,您不需要知道当前的值列表。

INSERT INTO user_membergroups (userid, groupid) 
SELECT `userid`, 100 FROM `user`
WHERE `userid` IN ( ... )