• 締切済み

テーブルの集計+結合

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

  • MySQL
  • 回答数2
  • ありがとう数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

  • テーブルを結合

    テーブルの結合に関して質問します。 ネットなどでinner joinを使った複数のテーブル結合が参考として 書いてあったのですが(3つまで), 4つテーブルを結合する事は 出来るのでしょうか? A,B,CテーブルにはID,NAMEがあります。 DテーブルにはA,B,CテーブルのIDがあります。 参考サイトを見て3つのテーブルを結合するSQLが以下になります。 SELECT a.name, b.name, c.name FROM a INNER JOIN (b INNER JOIN c ON b.id = c.id) ON a.id = c.id よろしければアドバイスお願いします。

  • テーブルの結合に付いて

    こんにちわ 2つのテーブルからデータを検索する方法に関してです。 テーブル AとB が有り、 お互いに、フィールド ExtID で関連付けがされているとします。 ここで、 SELECT A.NAME, B.ADDRESS FROM A INNER JOIN B ON A.ExtID = B.ExtID とする方法と SELECT A.NAME, B.ADDRESS FROM A,B WHERE A.ExtID = B.ExtID が有ります。 この2つに関して、違いとかメリット・デメリット有りましたら教えてください。 よろしくお願い致します。

  • MySQL複数テーブルからの情報取得に関しまして

    Aテーブル...ユーザ情報 Bテーブル...商品情報(AテーブルのユーザIDを列として持っています) Cテーブル...アイテム情報(Bテーブルの商品IDを列として持っています) Bテーブルの一覧リスト表示の画面にて、検索項目として、 Aテーブルのユーザ名、Cテーブルのアイテム名があります。 現在は、LEFT JOINを使って、検索、呼び出しを行っておりますが、 多数のカラムを指定して呼び出しを行っているため、SQL文が長くなってしまっており、 もっとすっきりとしたSQL文を記述したいと考えております。 ※Aテーブル,Bテーブルの組み合わせは他の画面でもよく使われております。 viewという機能を使うことによって、これをすっきりと記述できるようになるのではないかと考えておりますが、viewはこのような使い方をしてもいいのでしょうか。 または、もっとすっきりとした記述を行う技術のアドバイスをお願いいたします。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 同じ構成のテーブルを結合する

    AとBという全く同じ列構成からなるテーブルの結合を考えています。 イメージとしては、Aのレコードが全て表示された下にBのレコードが列挙されるような感じです。 "INNER JOIN"、"LEFT OUTER JOIN"で行った結果、AとBでキーに同じ値を持つと、どちらかの値で上書きされてしまうみたいなのでイメージ通りにはいきませんでした。また、"CROSS JOIN"ではAの右側にBの内容が追加されてしまうのもあって、イメージ通りにできませんでした。 どなたかこのSQL文が分かる方はお教えいただけないでしょうか? よろしくお願いします。 データベース:SQL Server

  • 2テーブルが同じユーザテーブル参照するときの結合

    2つのテーブルで、同じユーザテーブルを参照してデータ取得したいのですが、 どうやって結合すれば良いのでしょうか? ■概要 ・ユーザがアクションに挑戦すると、結果を表示 ・その際、「アクション作成者」と「アクション挑戦者(ユーザ)」を表示したい ※「作成者」「挑戦者」は、同じ「user」テーブルで管理したい ■3テーブル ・「result」「action」「user」 ・「result」「action」テーブルには、それぞれ「user_id」カラムがある ・「result」テーブルには、「action_id」カラムがある。1対多? ■知りたいこと ・一気にまとめて一覧として取得する方法 ・最終的に「結果」と、「result」「action」それぞれに対応した「user」テーブルの「name」カラムを取得したい ■試してみたこと ・これだと「挑戦者名」が取得できない       SELECT *        FROM result r         LEFT JOIN `action` a ON r.`action_id` = a.`id`         LEFT JOIN `user` u ON r.`user_id` = u.`id` ・これだと「挑戦者」のユーザIDしか取得できない       SELECT *,a.user_id AS actionuser_id        FROM result r         LEFT JOIN `action` a ON r.`action_id` = a.`id`         LEFT JOIN `user` u ON a.`user_id` = u.`id`

    • ベストアンサー
    • MySQL
  • テーブルの結合について

    テーブル結合に関するSQL文について質問させてもらいます。 DBはSQLServer2005です。 下記のような二つのテーブルがあります。 テーブルA コード A111 A111B A222 A333 テーブルB コード    数量  A111     1 A111B    2 A222     3 A222B    4 上記2つのテーブルから下記の結果を表示させたいのです。 コード    数量  A111     1 A111B    2 A222     7 A333     0 テーブルBのコードがテーブルAにある場合、そのまま数量を表示。 ない場合、コードの4桁目まででサマリした合計値を表示させたい。 LEFT JOIN等をいろいろためしてみたのですがうまくいきません。 おわかりの方、方教えてください。    

  • テーブル結合について

    テーブルの結合についてお聞きしたいことがあります。 カラム「KEY」を結合条件に テーブルA、B、Cを結合して【取りたい結果】のようなデータを取りたいと思っています。 しかし、テーブルAにBとCをLEFT JOINを結合した所、 【取得された結果】のデータが取得されました。 どのような結合をしたら期待通りの結果が得られるのでしょうか? 回答宜しくお願いします。 【取得された結果】 key dataA dataB dataC ------------------------------------------------- 1 A-1 B-1 C-1 A-1 B-1 C-2 A-1 B-1 C-3 2 A-2 3 A-3 【取りたい結果】 key dataA dataB dataC ------------------------------------------------- 1 A-1 B-1 C-1 A-1 C-2 A-1 C-3 2 A-2 3 A-3 【テーブルA】 key dataA --------------------- 1 A-1 2 A-2 3 A-3 【テーブルB】 key dataB --------------------- 1 B-1 【テーブルC】 key dataC --------------------- 1 C-1 1 C-2 1 C-3

  • 結合したテーブルの検索条件について。

    分からないことが出てきたので、すみませんが、教えてください。 次のような2つのテーブルを仮定します。 テーブルa  テーブルb no, title   no, aNo, delFlag  1, あえ    1, 1,  ,0 2, ああ    2, 3,  ,0 3, いう    3, 4,  ,1 4, あいあ ここで、titleに「あ」を含み、delFlagで「1」が立っていないものを検索したいのです(テーブルaのnoで、1,2を検出したい)が、 SELECT a.no AS no FROM a LEFT JOIN b ON a.no=b.aNo WHERE a.title LIKE '%あ%' and b.delFlag != 1 だと、テーブルaのno.2が検出できません。 このようなケースで、テーブルaのno1,2を選び出すことができる方法はないでしょうか? 以上、分かりにくい説明ですが、よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 複数テーブルを結合するには?

    OS:WINDOWSXP SP2 ORACLE:Oracle9i Enterprise Edition Release 9.2.0.1.0 A, B, Cというテーブルがあるとします。 それぞれのテーブルには XXカラムと YYカラムがあるとします。 2つのテーブルを結合させるには、以下のSQL文を記述すれば良いと考えています。 SELECT A.*,B.* FROM A JOIN B ON A.XX = B.XX 3つのテーブルを結合するには、以下のSQL文を記述しています。 SELECT A.*,B.*,C.* FROM A JOIN B ON A.XX = B.XX JOIN C ON A.XX = C.XX 但し、この記述方法でいきますと、Cテーブルを右側外部結合に指定した場合のみ、 ORA-00904 "C" 無効な識別子です。 というエラーメッセージが表示されます。 SELECT A.*,B.*,C.* FROM A JOIN B ON A.XX = B.XX RIGHT OUTER JOIN C (←LEFT OUTER、FULL OUTER)なら通ります) ON A.XX = C.XX 何故、右側外部結合のみ不正となるのか不明であり、解決策が見つかりません。 複数のテーブルを結合する為のSQL文の記述方法を教えて頂けますでしょうか?

  • テーブルの結合・・・

    教室テーブル id, class 1, A組 2, B組 3, C組 生徒テーブル id, name 1, 佐藤 1, 山田 2, 鈴木 3, 田中 3, 後藤 3, 加藤 という二つのテーブルがあります。 これらをLEFT JOINで結合したのですが。 A組, 佐藤 A組, 山田 B組, 鈴木 C組, 田中 C組, 後藤 C組, 加藤 となってしまいます。 これを同じ教室名でまとめて、 A組, 佐藤 山田 B組, 鈴木 C組, 田中 後藤 加藤 というように表示したいのです。 できればクエリだけで解決したいのですが・・・ よろしくお願いします。

    • ベストアンサー
    • MySQL