• 締切済み

テーブルの集計+結合

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人であればそのまま結合できるのですが、同じタイトルのものの評価を平均しないといけないため、頭がおかしくなりそうです。

みんなの回答

回答No.2

>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.商品説明

  • n09430515
  • ベストアンサー率52% (11/21)
回答No.1

一度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は要らなくなります。

pky7182
質問者

お礼

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

関連するQ&A