人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

ある変数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にレコードは残しておきます。

●質問者: iwanfa2
●カテゴリ:ウェブ制作
✍キーワード:dB SELECT いもの リスト レコード
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● Mook
●35ポイント

データ管理をするテーブルを 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 )

2 ● b-wind
●35ポイント

それまでリストにあった(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 だけでもいい)

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ