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
(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);
}
とか…
だいぶ力尽くですね。
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’]));
}
ありがとうございます。こちらも確認してみます。
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つ目の回答を参考になんとかなりそうです。
ありがとうございました。
たったの数行なのに初心者なので難しく感じます。本当に初歩的なSQL文しか理解していないので、、、。コードが長くなってもいいのでもう少し分かりやすいと嬉しいのですが、勉強しながら処理を確認してみます。
どうもありがとうございました。