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

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;
}

●質問者: p_question
●カテゴリ:ウェブ制作
✍キーワード:as AVG BBS DB PHP
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● chuken_kenkou
●100ポイント

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)を繰り返し
関連質問


●質問をもっと探す●



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