プロが教える店舗&オフィスのセキュリティ対策術

MySQL+ PHPについて質問です。
商品リスト(テーブルA)から、商品名で関連付けられたユーザー評価(テーブルB)があったとします。
ユーザーが商品ページから評価を5段階でを入れれるようにしました。

商品一覧のページで商品リスト(テーブルA)を表示させ
さらにユーザー評価の平均を一緒にテーブルAの商品名から関連付けるように表示させたいのですが、どうやったらいいのでしょうか。
イメージは下記の通りです。

---------------------------------------------------------------
商品名(テーブルA) ∥ 商品説明(テーブルA) ∥ 商品ランク(テーブルB)
---------------------------------------------------------------
オレンジ | おいしい | 評価5
---------------------------------------------------------------
りんご | おいしい | 評価4
---------------------------------------------------------------

試したSQL文は以下の通りです。

"SELECT title, avg(rank) as avgrank FROM テーブルB group by title
join
テーブルA
テーブルA .title = テーブルB.title";

残念ながらエラーなのですが、正しくはどう書くのでしょうか。
単純にユーザーが1人であればそのまま結合できるのですが、同じタイトルのものの評価を平均しないといけないため、頭がおかしくなりそうです。

A 回答 (2件)

一度VIEWを作る(createする)のがとりあえず簡単だと思います。



create view viewB as
select title, avg(rank) as avgrank FROM テーブルB group by title;

viewBを作ったあとなら、いつでも下の文で結果が取れます。

select * from テーブルA
inner join viewB
on テーブルA .title = viewB.title
;

inner joinをleft outer joinに変えるとランクなしの商品も出るようになります。
joinしているviewBをインラインビューに変換すればあなたが試したSQL文に近い実現方法にもなります。create viewは要らなくなります。
    • good
    • 0
この回答へのお礼

MySQLのバージョンが4.0なんですが可能でしょうか?

お礼日時:2009/05/17 13:20

>MySQLのバージョンが4.0なんですが可能でしょうか?



MySQLの質問をする場合は、バージョンを明記してください。

MySQL 4.0以前・・・union、一部のjoin、一時表などは実装済
MySQL 4.1・・・joinの拡張、サブクエリ、インラインビュー、unicodeなどの実装
MySQL 5.0・・・ビュー表、ストアドプロシジャ、トリガなどの実装

と、すぐに思い出せるだけでも、大きな機能拡張がたくさんあります。

各表の構成列、データ型、表と表は1:1か1:nかなどの情報を、できれば提示してください。そうすることで、無駄なやり取りを少なくでき、早く適切なアドバイスを得られるかも知れません。

次にSQL例を示します。

SELECT A.商品名,A.商品説明,avg(商品ランク) as avgrank
FROM A
LEFT JOIN B
ON A.商品名=B.商品名
GROUP BY A.商品名,A.商品説明
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す