• 締切済み

3つの表の結合から、2つの表のみのカウント数

PHPとMySQLにて図書館のプログラムを作成しています。 今回の問題の箇所で必要な表は3つです。 関係のある項目のみ記述します。 bookテーブル    (isbn,本番号) reviewテーブル   (isbn,評価) rentalテーブル   (本番号) グループ化として、isbnでグループ化しています。 ページに必要な情報は、3つの表から必要なため、それぞれを外部結合させています。 今回、そのページでは、ソート機能としてプルダウンメニューからソートしたい項目を選択すると、それに応じてソートさせています。 五十音順、評価順、レンタル数順、新着順とありますが、その中でレンタル数のみうまくいきません。 レンタル数のみであれば、bookテーブルとrentalテーブルのみでカウントすれば正常に結果が得られますが、そこに外部結合でもう1つ表が加わっていることが原因で、正しい結果が得られません。 何か方法はありますでしょうか?、

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

まずは、正規化されていないbookテーブルを調整した方がよいですね。 bookテーブルでは本番号というidでユニークになっていますが 実際1と2、3と4が同じなのでタイトルも同じですね。 そうなるともう一段階正規化が必要になります。 例えばbookmasterテーブルとか・・・そういう本の情報をとっておくやつ。 bookテーブルとrentalテーブルを外部結合してさらにbookmatster テーブルに外部結合すると正式なカウントが得られます。 またreviewテーブルは外部結合するにはムリがあります。 仮にbookとrentalテーブルで集計した物にレビュー情報をつけたいなら とくにカウントをとりたいのにレビューを外部結合してしまっては なんのカウントなのかさっぱりわからないことになります。 別SQLでwhere isbn='111'など抽出してやるのが妥当でしょう。

anzyaa
質問者

お礼

具体的な改善点も指摘して頂き、ありがとうございます。 bookテーブルはほぼすべてのプログラムで使用していますので、テーブルを組みなおすのは少々時間がかかるので、すぐに試せませんが、アドバイスを参考に改善してみます。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

MySQLのバージョンは、何ですか? ~4.0、4.1、5.0~で多くの機能追加があり、一部、仕様変更もされています。せっかく、具体的なSQLを提示しても、質問者さんの環境では動かないかも知れません。 元の表のデータ例、得たい結果例、今考えているSQLを示してください。 文章でだらだらと書かれても、曖昧であったり、いろいろな解釈ができてしまいます。データ例やSQLを示してもらうことで、回答者側でも、「やりたいこと」を推測しやすくなります。

anzyaa
質問者

補足

回答ありがとうございます。 質問のアドバイスありがとうございます。 MySQLのバージョンは5.0です。 では、テーブルのデータ例です。 分かりやすくするために、必要な項目のみ、また、簡潔なデータ表記にします。項目名も分かりやすいように日本語表記にします。 bookテーブル ------------------------------------------ タイトル    isbn     本番号 ----------------------------------------- あ       111       1 あ       111       2 い       222       3 い       222       4 う       333       5    reviewテーブル ------------------------------------------ point     isbn     内容 ----------------------------------------- 5       111      この本は…(レビュー本文) 4       222        4       333        3       111        2       333    rentalテーブル ------------------------------------------ 会員     本番号     貸出日 ----------------------------------------- a       5      2007/09/06 b       3      2007/09/07 c       5      2007/09/08 d       3      2007/09/09 e       3      2007/09/10 質問の部分でも記載しましたが、PHP部分で3つの表からそれぞれ情報を抽出し、ソートしたいと考えています。 その中で、うまくいかないのがレンタル数が多い順番にソートするというものです。 bookテーブルとrentalテーブルの2つの表だとうまくいきます。 select b.タイトル,b.isbn,b.本番号,count(isbn) as ccc from book b,rental r where  b.book_id = r.book_id group by isbn order by ccc desc; 得られる結果 ------------------------------------------ タイトル    isbn     ccc(貸し出し数) ----------------------------------------- い       222       3 う       333       2 あ       111       0 このような結果を得たいのです。 しかし、今回、他にもソート項目があるため、3つの表を結合する必要があります。 そして、カウント数を取ると、うまくいきません。 以下、うまくいかなかったSQL文です。 select b.タイトル,b.本番号,b.isbn,count(b.isbn) ccc,TRUNCATE(avg(r.point),1) point from (book b left join review r on r.isbn = b.isbn) left join rental t on b.book_id = t.book_id group by isbn order by ccc desc 何か足りない情報等があれば、おっしゃってください。 お願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Excel VBAで結合されたセルの数

    列方向に項目番号、行方向に内容が記入された表があります。 この、項目番号のセルは結合されており、その結合数は色々(3~9)です。 この時、例えば上から3項目を選択した際、VBA上でそれが上から3段目である事が判る様にしたいのですが、どの様にすればいいのでしょうか? セルの結合数が同じ場合は行番号から判断出来るのですが、結合数が一定で無い場合の方法が分からなくって困っています。 宜しくお願い致します。

  • 表の結合(性能)

    2つのテーブルを(内部)結合させる場合、 INNER JOINによる結合と WHERE句に結合条件を記述する2通りの方法が あると思いますが、どちらが早いのでしょうか? なお、Oracle9i、ルールベースにて構築されています。 テーブルの内容、SQL文は下記のとおりです。 ご教授よろしくお願いします。 ■表 A 項目A-1 ・・・PRIMARY KEY1、INDEX1 項目A-2 ・・・PRIMARY KEY2、INDEX2 項目A-3 ・・・PRIMARY KEY3 項目A-4 ■表 B 項目B-1 ・・・PRIMARY KEY1、INDEX1 項目B-2 ・・・PRIMARY KEY2、INDEX2 項目B-3 ・・・PRIMARY KEY3 項目B-4 ※項目A-1と項目B-1にて結合。  項目A-2が"01"と等しいレコード。 表Aのレコード件数>表Bのレコード件数 【WHERE句にて結合】 SELECT * FROM A,B where A.項目1 = B.項目1 and A.項目2 = '01' 【INNER JOINにて結合】 SELECT * FROM A INNER JOIN A ON A.項目1 = B.項目1 AND A.項目2 = '01'

  • 表と表の結合について

    新人研修で、「表の結合の際に、結合する列がなぜその列なのか?」を説明する方法を悩んでおります。 <元表> 商品コード、商品名、購入数、顧客情報 <正規化> 商品テーブル:商品コード、商品名 売り上げテーブル:商品コード、購入数量、顧客I これを見たとき、私は 「商品コード」で 結合すれば、「どこ顧客が、何の商品」を購入されたかというのがわかるのですが、 [質問1] なぜ商品コードで、「結合する仕様になっているか」の説明を求められたとき うまく説明する方法が思いつきません・・・。 「売り上げ伝票から正規化されて作成されたから、正規化する前の情報を出せるように関連付けするために、主キーの商品コードを、各表2つに残しておく。」 と言う説明しか出来ないのです。 もっとわかりやすい説明がありましたらご教授のほうお願いします。 できれば、正規化と言う情報を使わずに、「商品コード」で結合する理由を説明したいのです。

  • 異なる項目を持つ複数の表を、一つに結合して表示する

    以下のように、日付以外は異なるデータ列を持っている二つの表があった場合に、 それを日付順に結合して表示したいのですが、SQLを用いてできるものなのでしょうか。 ■入力(date項目以外、異なる項目を有する複数のtable) テーブル名:table1 項目名:date(日付),tenki(コメント文章),flag1(フラグ1) データ例: 2010/1/1,雨,1 2010/1/3,晴れ,1 テーブル名:table2 項目名:date(日付),nikki(コメント文章) データ例: 2010/1/2,ゲームした 2010/1/4,会社でした ■出力 table1とtable2をdate項目の昇順に結合し、table1のcommentと、tableのnikkiは、 同じコメント文章のため、同列で出力させたい。 出力イメージ: 2010/1/1,雨 2010/1/2,ゲームした 2010/1/3,晴れ 2010/1/4,会社でした ■補足 上記の入力tableを最初から一つのtableで作るべきだったとは思いますが、 実際は、それぞれ異なる意味を持つもののため、テーブルを分けていますので、 tableを一つにするという解は除いたアドバイスをお願いいたします。

    • ベストアンサー
    • MySQL
  • オラクルで外部結合

    オラクル8iを使用しています。 テーブルを外部結合する場合のパフォーマンスについてお聞きしたいのですが、 下の二つのSQL文でパフォーマンスは変わってくるのでしょうか? (外部結合記号(+)を=の前後につけた場合) SELECT 項目 FROM テーブル1 A, テーブル2 B WHERE A.項目1 = B.項目1(+); SELECT 項目 FROM テーブル1 A, テーブル2 B WHERE B.項目1(+) = A.項目1;

  • 外部結合について

    こんばんは。 SQLでの外部結合について教えてください。(オラクルの場合です) データを取得しいテーブルが4つあったとします。 Aテーブルのキーは、「ユーザーID」と「名前」と「住所」だとします。 Bテーブルのキーは、「名前」と「郵便番号」とします。 Cテーブルのキーは、「名前」と「郵便番号」とします。 取得したいデータは、全てのテーブルに存在しています。 Aテーブルに対してBテーブルとCテーブルを外部結合したいと思っています。 Aテーブルには「ユーザーID」があります。 Bテーブルからは、「給料」データが取得したいのです。 Cテーブルからは、「年齢」データが取得したいのです。 B,Cのテーブルに条件に合致するものがなくても、AのユーザーIDだけは 表示したいと思っています。 自分なりに考えて色々試したのですが、うまく行かず構文でエラーになります。 どうしてもAテーブルに外部結合したいです。 SELECT  A.ユーザーID,  B.給料,  C.年齢 FROM  A,  B,  C WHERE  A.ユーザーID = ’XXXXX’,      A.名前 = ’AAAAAA’,      A.住所 = ’KKKKKKKKKKK’,      A.名前(+) = B.名前,      A.名前(+) = C.名前,      A.郵便番号(+) = B.郵便番号,      A.郵便番号(+) = C.郵便番号 このように考えたのですが,「すでに1つの表と外部結合されています」みたいに エラーがでてしまいます。 どのように修正すれば、よいのでしょうか? よろしくお願い致します。      ※全角になっているなどは、見やすくする為にやっています。

  • 外部結合とカウントができない!

    お世話になります。 ここ数日、外部結合とカウントを組み合わせたSQL が思うようにかけず大変悩んでいます。 学校・クラス・生徒テーブルをJOINして、 合否判定数を求めたいのですが、 期待する結果になりません。どなたか助けて下さい>< ポスグレ+PHPです。 事情によりプログラム側でカウントできないので、 SQLで一気に取得しなければならないのがネックです。 以下3テーブルと期待する結果テーブルです。 ///////////////////////////////////////////////// 学校テーブル -------------- ID   学校名 -------------- 1   あああ 2   いいい -------------- クラステーブル ---------------------------- ID   学校ID   クラス名 ---------------------------- 1     1     6-1組 2     1     6-2組 3     2     5-1組 ---------------------------- 生徒テーブル ---------------------------------------------------- ID   学校ID   クラスID   生徒名   合格判定 ---------------------------------------------------- 1     1      1     AAAAAA    TRUE 2     1      1     BBBBBB    FALSE 3     1      2     CCCCCC    TRUE ---------------------------------------------------- 期待する結果 ---------------------------------------- ID   学校名   受験数   合格数 ---------------------------------------- 1    あああ    3     2 2    いいい    0     0 ---------------------------------------- ///////////////////////////////////////////////// どなたか助けてやってくださいm(_ _)m

  • 固定値を含む結合と複数テーブルの結合について

    「1.固定値を含む結合」と「2.複数テーブルの結合」について教えて下さい。 最近oracleを使い始めてSQLで表の結合を書く場面があるんですが LEFT(RIGHT) JOIN を使うのか、(+)を使って書くのかで迷っています。 LEFT(RIGHT) JOINだと固定値を含めて外部結合しようとするとエラーになってしまいます。 それが嫌で(+)を使っていたんですが 今度は複数のテーブルを(+)で結合しようとするとエラーになってしまいます。 (AテーブルとBテーブル、AテーブルとCテーブルなど?) こういう場合はどうすれば良いのでしょうか? とりあえず副参照をFROMに指定して対処してるんですが 何かきちんとした書き方があるのでしょうか?誰か教えて下さい。

  • MySQLで複数データベースの検索/ソートについて

    お世話になっております。 PHP4.4.1+MySQL4.1.15を使用しております。 複数のデータベースに含まれる複数のテーブルをひとつの大きなテーブルとして検索/ソートする方法はありませんでしょうか? 結合ではなく、全レコードを全て単体として検索/ソートをかけたいのです。 それぞれのデータベースに含まれるテーブルに、共通の項目があり、その共通の項目順にソートしたり、絞込をかけたりしたいのですが、調べてみても、どうしても結合(JOIN)に行き着いてしまいます。 JOINによる結合だと、共通の項目以外のレコードが表示されないので、これでは意味をなしません。 ご教授の程、お願い致します。

    • ベストアンサー
    • MySQL
  • SELECTしながらカウント

    3つのテーブルを結合してselectしてるんですが、ある項目に1,2,3,4という値が入っています。1が何個で2が何個、3が何個4が何個と言う風に数を習得したいのですが、そのような事はできますか?どなたかご教授ください。お願いします。

このQ&Aのポイント
  • MFC-J4940DNの印刷で罫線ズレが起き、補正してもすぐに再発するトラブルについて相談です。
  • お使いの環境はMacOSで無線LAN接続です。
  • 関連するソフトやアプリについては特記されていませんが、電話回線はひかり回線を使用しているようです。
回答を見る