在我的用户表中,我有一个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。
谢谢,如果有人可以帮助我。我确定这是谷歌,但我不知道怎么说。
答案 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 ( ... )