1

私のユーザー テーブルには、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
)

したがって、基本的に、私がやろうとしていることは..ユーザーIDが()にリストされているものの1つである場合、クエリが列membergroupidsに「、100」を追加するようにしようとしています。
しかし、ここに問題があります。これらのユーザーはすべて、membergroupid にリストされている値を既に持っています。
たとえば、ユーザー 312 は、列 membergroupids に既に次の値を持って

ます
。 38,59,100

..そして、リストされている他のすべてのユーザー ID に対して。

誰かが私を助けることができればありがとう。これはGoogleにあると確信していますが、言葉にする方法がわかりませんでした。

4

2 に答える 2

2

スキーマを変更できないという不幸な立場にあるため、値を既存の値に連結することで値を追加できます。CONCAT()

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

現在空の を持っていても、それはすべてのユーザーに強制,100されます。空のものを考慮するには、条件を使用できます。membergroupidsCASE

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 ...

理想的な世界では、ユーザー <--> グループ メンバーシップは、適切な多対多の関係で処理されます。これにより、2 つの列を持つ 3 番目のテーブルがユーザーをグループに割り当てるために使用されますuserid, groupid

于 2013-03-30T14:27:56.840 に答える
1
UPDATE `user` SET `membergroupids`=CONCAT(`membergroupids`, ',100') 
WHERE `userid` IN ( ... )

もちろん、これはリストに少なくとも 1 つの membergroupid がすでにあることを前提としています。リストが空の場合に ',100' を追加すると、先頭にカンマが付いたリストになりますが、これは通常は望ましくありません。簡単な解決策は次のとおりです。

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

また、membergroupids のリストが長くなりすぎて、varchar 列の長さ制限に収まらない場合はどうなりますか? 「申し訳ありませんが、グループ メンバーシップのリストを保存できないため、そのグループに参加できません。グループ ID の値が短いいくつかのグループに参加したい場合は、さらに多くのグループに参加できます。」

コンマ区切りの文字列に値のリストを格納することは、リレーショナル データベースの設計としては適切ではありません。Is storage a delimited list in a database column really that bad?に対する私の回答の落とし穴の説明を参照してください。

メンバーシップを交差テーブルの行ごとに 1 つずつ保存すると、ユーザーのメンバーグループを追加しやすくなります。そうすれば、現在の値のリストを知る必要はありません。

INSERT INTO user_membergroups (userid, groupid) 
SELECT `userid`, 100 FROM `user`
WHERE `userid` IN ( ... ) 
于 2013-03-30T14:30:15.863 に答える