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

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:ke_ishi No.1

回答回数269ベストアンサー獲得回数0

ポイント30pt

(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);

}

とか…

だいぶ力尽くですね。

id:ktoshi

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

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

2004/12/16 23:17:54
id:ke_ishi No.2

回答回数269ベストアンサー獲得回数0

ポイント50pt

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’]));

}

id:ktoshi

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

2004/12/17 11:25:28
id:hide-wm No.3

回答回数15ベストアンサー獲得回数0

ポイント20pt

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)

で、いかがでしょうか?

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

id:ktoshi

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

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

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

2004/12/18 00:38:16

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

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

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

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

回答リクエストを送信したユーザーはいません