PHP4,MySQL4でのSQL文


■目的
掲示板で、投稿に対し評価が出来る
そのユーザの全ての投稿に対する評価の平均点を、ユーザ管理用テーブルのユーザ投稿の評価の平均として、UPDATEするSQL文を作りたい

■DBの構造
テーブルは、ユーザ用(user)、投稿用(bbs)の2つ
以下、必要なところだけ

userテーブル
ユーザID, 投稿採点の平均
user_id, rate_avg

bbsテーブル
投稿ID, スレッドID, ユーザID, 採点点数,
bbs_id, thread_id, user_id, rate,

■欲しいSQL文
スレッドIDに投稿した全てのユーザIDの、今まで投稿した全てのrateの平均を出し、それをユーザテーブルのavg_rateにUPDATEをする

■条件
サブクエリーは利用不可
PHP側での処理は可能

■自分でやったこと
自分で考えたクエリーは以下の通り
SELECT user_id FROM user WHERE thread_id = ?

ここで出てきたuser_idを
SELECT user_id, AVG(rate) AS tmp_avg FROM user WHERE user_id IN(前回のクエリーの結果のuser_id)

foreach ($result AS $user_id => $tmp_avg) {
//以下のようなSQLをuser_id文叩くので、どうかと…
//UPDATE user SET rate_avg = $tmp_avg WHERE user_id = $user_id;
}

回答の条件
  • 1人2回まで
  • 登録:2007/06/10 19:10:09
  • 終了:2007/06/14 06:00:48

回答(1件)

id:chuken_kenkou No.1

chuken_kenkou回答回数722ベストアンサー獲得回数542007/06/12 16:45:54

ポイント100pt

user表が空で、insertしていいなら、以下の単発のSQLで実現可能です。

insert into `user`
 select user_id,avg(rate)
  from bbs
  group by user_id

updateで行なう必要があるなら、一度、一時表に格納すると、処理が簡単だと思います。

-- 一時表の定義
create temporary table temp
(user_id         varchar(8),
 rate_avg        int);

-- 一時表に格納
insert into temp
 select user_id,avg(rate)
  from bbs
  group by user_id;

-- 一時表から、user表に反映
(1)select * from temp
(2)update `user` 
    set rate_avg=(1)で得た値
     where user_id=(1)で得た値

(1)~(2)を繰り返し

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

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

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

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

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