ある変数x,y,zの組み合わせ複数行が記録されたリストからDBに追加していくとします。

xは作成時間、yは作成者名、zは訪問者数であるので、x,yは値が変わることはなく、zは値が変動するとします。リスト中のx,yの組み合わせはただ一つであるとします。
(x,y,z)=(2009/11/01 20:07,一郎,3),(2009/11/01 20:07,次郎,2)..などとし、
(x,y,z)=(2009/11/01 20:07,一郎,3),(2009/11/01 20:07,一郎,9)..などの組み合わせはありません。

リストから正規表現で取り出し、x,y,zにそれぞれ代入します。
DBをselect文でx,yについて検索して存在しないものはinsert、
存在しそのzの値がリストのものと異なる(変動した)場合はupdateします。

リストは不定期に更新されるので、この処理(insert/update)を一定時間ごとに繰り返します。

それまでリストにあった(DBにはinsert済み)のにリストから消えた場合についてある処理をしたいのですが、これはどのような条件式(判別処理)を使えばいいのでしょうか?
リストから消えてもDBにレコードは残しておきます。

回答の条件
  • 1人2回まで
  • 登録:2009/11/01 20:12:25
  • 終了:2009/11/08 20:15:02

回答(2件)

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912009/11/01 21:19:22

ポイント35pt

データ管理をするテーブルを data_tbl、同じ構造を持つリストのテーブルをtmp_list とすると下記のクエリで

それぞれの処理ができないでしょうか。


クエリは MySQL の例です。


  • リストにだけあるものを新規登録する
INSERT INTO data_tbl
SELECT * FROM tmp_list
WHERE CONCAT(x,y) NOT IN ( SELECT CONCAT(x,y) FROM data_tbl )

  • すでにテーブルにあるものをデータ更新する
UPDATE data_tbl INNER JOIN tmp_list ON data_tbl.x = tmp_list.x AND data_tbl.y = tmp_list.y
SET data_tbl.z = tmp_list.z;

  • リストになくデータにだけあるものを表示する
SELECT * FROM data_tbl WHERE CONCAT(x,y) NOT IN ( SELECT CONCAT(x,y)  FROM tmp_list )
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402009/11/01 21:20:42

ポイント35pt

それまでリストにあった(DBにはinsert済み)のにリストから消えた場合についてある処理をしたいのですが、これはどのような条件式(判別処理)を使えばいいのでしょうか?

リストから消えてもDBにレコードは残しておきます。

なんだかやけに長いけど、問題はここの部分だけだよね。

単に論理削除の状態を作るだけだと思うけど。


select/insert/update って書いてあるからには RDBMS を前提にしていると仮定する。

対応としては至極簡単。判別用のフラグを持てばいい。

たとえば status と言うカラムを数値でもっておいてデフォルトは 1 (通常)

更新処理のバッチ(もしくはそれ相当のプログラム)を走らせる時点で status が 1 の物をすべて 2 (作業中)に変更

update が行われた物は status を 1 に戻す。insert は無指定でデフォルト値を使うか明示的に 1 を指定する。

更新処理完了後 status が 2 の物が直近で削除された物と判定できる。

このレコード群を select で取得し「とある処理」を行う。

処理後は status を 3 (削除)に設定する


通常の参照時には status が 1 or 2 の物のみを取り出すことで削除していないデータのみが取り出せる。

(トランザクションがちゃんとサポートされていて適切に使えば 1 だけでもいい)

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません