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

SQLの質問。初心者で質問が変かもしれませんがご容赦を。
2つのテーブルがあり、以下の条件に従って処理を実行したい。処理方法を教えてください。使用しているのはpostgreSQL+PHPです。

条件および処理:
(1)table_01.name_A=table_02.name_Bの場合、table_01.count=table_01.count+4
(2)table_01.check_A=1の場合、table_01.count=table_01.count+2
(3)table_02.check_B=1の場合、table_01.count=table_01.count+1

table_01(データ数は約7万件)
name_A,check_A,count
101,1,0
102,1,0
103,1,0
101,0,0

table_02(データ数は約400件、name_Bに重複noは無し)
name_B,check_B
101,1
102,0
103,1

●質問者: ktoshi
●カテゴリ:コンピュータ
✍キーワード:PHP postgreSQL SQL データ 初心者
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● ke_ishi
●30ポイント

http://google.com/

Google

(3)が(1)とのAND条件であるとして…

PEAR DBでは

$rtn = $db->query(”SELECT * FROM table_01”);

while($row = $rtn->fetchRow()){

$sql = sprintf(”UPDATE table_01 SET count=count+(CASE WHEN (SELECT count(*) FROM table_02 WHERE name_B=%d) THEN 4 ELSE 0)+%d+(SELECT count(*) FROM table_02 WHERE name_B=%d AND check_B=1) WHERE name_A=%d AND check_A=%d”, $row[’name_A’], $row[’check_A’]?2:0, $row[’name_A’]);

$db->query($sql);

}

とか…

だいぶ力尽くですね。

◎質問者からの返答

たったの数行なのに初心者なので難しく感じます。本当に初歩的なSQL文しか理解していないので、、、。コードが長くなってもいいのでもう少し分かりやすいと嬉しいのですが、勉強しながら処理を確認してみます。

どうもありがとうございました。


2 ● ke_ishi
●50ポイント

http://www.php.net/

PHP: Hypertext Preprocessor

てっきりなるべくSQLで解決したいと思っていたのですが、PHPでも良ければ以下のような方法でどうでしょう。

$rtn = $db->query(”SELECT * FROM table_01”);

while($row = $rtn->fetchRow()){

$plus = 0;

if($row[’check_A’] == 1){

$plus += 2;

}

$rtn1 = $db->getRow(sprintf(”SELECT * FROM table_02 WHERE name_B=%d”, $row[’name_A’]));

if($rtn1){

$plus += 4;

if($row[’check_B’] == 1){

$plus += 1;

}

}

$db->query(sprintf(”UPDATE table_01 SET count=count+%d WHERE name_A=%d AND check_A=%d”, $plus, $row[’name_A’], $row[’check_A’]));

}

◎質問者からの返答

ありがとうございます。こちらも確認してみます。


3 ● hide-wm
●20ポイント

http://www.yahoo.co.jp/

Yahoo! JAPAN

URLはダミーです。

SQL部のみ記述しますと

(1)

update table_01 set table_01.count=table_01.count+4

where table_01.name_A = (select table_02.name_B from table_02)

(2)

update table_01 set count = count + 2 where check_A = 1

(3)

update table_01 set table_01.count = table_01.count + 1 where table_01.name =

(select table_02.name from table_02 where table02.check_B = 1)

で、いかがでしょうか?

手元に環境が無いので試してないのが申し訳ないです。

◎質問者からの返答

データが7万件以上あるので、条件を1つずつ処理してデータ更新をしていくのは効率悪そうです。

質問の仕方が悪くて申し訳ありませんが、2つ目の回答を参考になんとかなりそうです。

ありがとうございました。

関連質問


●質問をもっと探す●



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