質問: ### 前提・実現したいこと グループ機能において、あるグループに所属しているメンバーを更新しようとしています。 > > (参考: node-mysqlを使用しています。) > > > 更新しようとしているテーブルは、グループIDとユーザーIDを保持しています。 全く同じレコードが存在しないように更新をしたいのですが、どうすればよいのかがわかりません。 > > (Node.jsが保持している更新後のメンバーのリストと、MySQLが保持している更新前のメンバーのリストに重複がないことは保証されています)。 > > > 出来れば、いったん全部消しちゃうという方法はとりたくありません。 特にNode.jsのことには触れる必要はなく、MySQLの話だけで構わないのでよろしくお願いします。 簡単のために、具体的な値を設定しておきます。 * テーブル名: members * 更新しようとしているグループのID: 3 * 更新前のユーザーID: 未知(SELECTをすれば当然わかる) * 更新後のユーザーID: (2, 6, 9) ※テーブルの設計が悪いのであれば直します。 ### 試したこと 1. 更新後のリストに存在しないユーザーをすべて消す 2. 現在テーブルに存在していないユーザーを追加する こんな感じのアプローチになるかと思います。 ### 補足情報(言語/FW/ツール等のバージョンなど) MySQL: '5.5.49-0ubuntu0.14.04.1'
回答: 自分でも適当に書いてみました。 SQLのことはよく知らないのでもっと良い方法があるかもしれませんが、眠たいのでとりあえず寝ます。おやすみなさい。 1.更新後のリストに存在しないユーザーをすべて消す ``` DELETE FROM members WHERE groupID=3 AND userID NOT IN(2, 6, 9); ``` 2.現在テーブルに存在していないユーザーを追加する ``` INSERT INTO members(groupID, userID)( SELECT 3, C.userID FROM ( SELECT A.userID AS userID, count(*) AS sum FROM users AS A, members AS B WHERE A.userID IN(2, 6, 9) AND B.groupID = 3 AND A.userID != B.userID GROUP BY A.userID ) AS C, ( SELECT count(*) AS sum FROM members WHERE groupID = 3 ) AS D WHERE C.sum = D.sum ) ; ```