2つのテーブルからのデータ取得および件数の取得

このQ&Aのポイント
  • スキルに乏しい方向けのデータ取得方法を解説します。
  • 複数のテーブルからデータを取得し、コメント件数も表示する方法をご紹介します。
  • MySQLを使用してテーブル結合と集計を行い、データ取得とコメント件数の表示を実現します。
回答を見る
  • ベストアンサー

2つのテーブルからのデータ取得および件数の取得

お世話になっております。 以前、何度か複数のテーブルからのデータ取得に関し、質問させて頂きましたが、スキルに乏しく、以下のような内容で躓いております。 アドバイスも含め、スクリプトなどのご指摘を頂戴出来れば幸いです。 お忙しい中恐縮ですが、宜しくお願いいたします。 TB:diary no id(*) date subject contents 1  4  2007-10-07 ・・・・・・ 2  8  2007-10-07 ・・・・・・ 3  3  2007-10-06 ・・・・・・ 4  5  2007-10-06 ・・・・・・ *投函者ID TB:diary_comment no diary_no ...... 1  2 2  4 3  8 4  1 diary_id とは、diary(TB)のno(auto_increment)を指しています。 以上、複数の人が登録できるブログサイトのようなものを作っており、ブログを書いている人の日記一覧を表示させたとき、各記事に対していくつのコメントの投函があるかを、日記の一覧と同時に表示させたく、diaryのnoと同一番号のdiary_comment(ブログに対して記述されたコメント)内のdiary_noをカウントしたく、以下のソースを設置してみましたが、これだとコメントのあるものしか表示されません。 先にも述べましたが、スキルに乏しく、この手の検索にソースコードそのものにも自信がなく、アドバイスのみならずご指摘いただければと考えておりますので、宜しくご指導のほどお願い申し上げます。 //MySQL 4.0 $sql = "select D.`no`, D.`id`, D.`date`, D.`subject`, D.`contents`, count(*) as `count` from `diary_comment` C inner join `diary` D on D.`no` = C.`diary_no` where D.`no` = C.`diary_no` AND D.`id` = '$fri_id' group by D.`no`, D.`id`, C.`diary_no` order by D.`date` desc LIMIT $st, $lim;"; //$fri_idは、diary.TBのidを呼び出すためのGETから渡されたもの。

  • MySQL
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

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

あ、commentにdialyをjoinしてたんですよね。 じゃleftじゃなくてright join ですね。 省略してかくとこんなかんじ。 select D.`no`, D.`id`, D.`date`, count(C.`no`) as `count` from `diary_comment` AS C right join `diary` AS D on D.`no` = C.`diary_no` group by D.`no` order by D.`date` desc

sadacha
質問者

お礼

yambejp様 こんばんは。早速のお返事を有難う御座います。 お蔭様をもちまして、期待の結果を得ることが出来ました。 スキル不足が故に、このようなソースコードは実際の動作と比較しながら進めていけるので、非常にありがたく思っております。 有難う御座いました。

その他の回答 (1)

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

細かくみてませんが inner joinをleft joinでやってみてはどうでしょう?

sadacha
質問者

お礼

yambejp様 こんばんは。いつもお世話になっております。 早速の回答を有難う御座います。 >inner joinをleft joinでやってみてはどうでしょう? left joinでやっても結果は同じでした・・。 ソースそのものが違うのでしょうか・・。 引き続きご指導頂けたら幸いです。お忙しい中恐縮ですが宜しくお願いいたします。

関連するQ&A

  • 3つのテーブルからのデータ抽出

    こんにちは。お世話になっております。 http://oshiete1.goo.ne.jp/qa3421595.html 以前、上記箇所にて似たような質問をさせていただきましたが、同じテーブルを用い、違う検索結果を出そうとしたところ、思うような結果を得られずに居る次第です。 今日も一日中試行錯誤を繰り返しているのですが、どうにも描いている結果を得ることが出来ません。お忙しい中恐縮ですが、お知恵を頂戴出来れば幸いです。(MySQL 4.1) 前回の質問は・・・ memberテーブル id  n_name 1  大輔 2  雅彦 3  順子 4  幸子 5  明美 6  二郎 friendテーブル(id、f_idは、memberテーブルのidを指す。) no id f_id 1  3  5 2  5  3 3  3  1 4  1  3 5  3  6 6  6  3 diaryテーブル(idはmemberテーブルのidを指す。memberのidに該当する人の発言データ) no id  date  subject 1  3   //  今日は寒いね 2  5   //  美味しそう 3  2   //  疲れたな 4  2   //  頑張ろう 5  1   //  楽しいぞ 6  6   //  晴れるといいな ※dateは省略しています。 以上、例えばmemberテーブルにおいて、id(下記SQLでは$tb_idとしています)が3の順子を検索した際、 friendテーブルを参照し、idカラムが3の相手であるf_idを見つけ、更にそのf_idを基にmemberテーブル内のn_name、 かつdiaryテーブル内の、date、subjectを下記のように一覧表示させたいという質問でした。 二郎 晴れるといいな 大輔 楽しいぞ 明美 美味しそう と、ここで、 二郎 晴れるといいな 大輔 楽しいぞ 明美 美味しそう 順子 今日は寒いね 以上のように自分の発言を表示させようと、したところ現在、 二郎 晴れるといいな 大輔 楽しいぞ 明美 美味しそう 順子 今日は寒いね 順子 今日は寒いね と、自分の発言が2度出てきてしまう状態です。 ちなみにSQL文は、 $sql = "select c.subject,m2.n_name,c.date,c.no,f.f_id,f.id from member as m inner join friend as f on m.id=f.id inner join diary as c on f.f_id=c.id inner join member as m2 on m2.id=c.id WHERE ((f.id=$tb_id OR f.f_id=$tb_id) AND f.id!=f.f_id) order by no desc LIMIT 0, 30;"; ここ数日、色々調べており、特に昨夜からは(今日も一日中。汗)ずっと試行錯誤を繰り返しているのですが、思い描く結果を得ることが 出来ない状態です。 お忙しい中恐縮では御座いますが、アドバイスのほど宜しくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • MySQL サブクエリについて

    MySQL 5.1.32-community tb1 --------------------- |no| thread | date | -------------------- |1 |スレッドA| 2011/1/25 | -------------------- |2 |スレッドB| 2011/1/28 | |-------------------- tb2 --------------------- |no| mes | date | -------------------- |1 |コメントA| 2011/1/25 | -------------------- |1 |コメントB| 2011/1/28 | |-------------------- |1 |コメントC| 2011/1/29 | |-------------------- |2 |コメントD| 2011/1/25 | |-------------------- |2 |コメントE| 2011/1/28 | |-------------------- 下記が取り出したいデータです。 スレッドNo、スレッド名、スレッドの最新コメント、日付、コメント数です。 ---------------------------------------- |no|thread | mes | date |count(*) | ---------------------------------------- |1 |スレッドA | コメントC | 2011/1/29 |3 | ---------------------------------------- |2 |スレッドB | コメントE | 2011/1/28 |2 | |---------------------------------------- select * from tb1 as A left join tb2 as B on A.no = B.no where not exists( select * from tb2 C where B.no = C.no and B.date < C.date ) ; 取りあえず上記のSQL文でスレッドごとのコメント数(count(*))以外のデータを取り出せるようにはなりました。 スレッドごとのコメント数を追加して取り出そうと思っています。 スレッドごとのコメント数(count(*))まで取り出せるSQL文の作り方が解る方がいましたら、是非ご教授お願い致します。

    • ベストアンサー
    • MySQL
  • データ量が多すぎると、テーブルを分けたほうがいい?

    質問があるのですが、よろしくお願いします。 例えば、ミクシーで、日記機能がありますが、もしミクシーがMySQLを使っているとしたら、あの日記に書き込まれるコメントのデータはどのようにテーブルに格納されているのでしょうか?? 一つのテーブルで済まそうとするとデータがかなり膨大になって検索に時間がかかるのではないかと思うのです。 例えばid1番からid100番までの日記のコメントのデータは、nikki_comment_100_tというテーブル、id101番からid200番までの日記のコメントのデータはnikki_comment_200_tというテーブル、というように、いくつかに分割して格納してたりするのでしょうか?それとも、一つのテーブルで十分事足りるのでしょうか?? また、もし前者のように分割して分けているとしても、それは顧客が多くデータが膨大なミクシーのような大規模なサイトならではのことで、これから人を集めようとしている現段階では小規模なサイトのデータベースなら、わざわざテーブルを分割してデータを格納することはない・・・とかそんな感じなのでしょうか? どなたか分かる方いらっしゃいましたら、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • テーブルのどちらかにデータがない事があるテーブル結合について

    ■table a のテーブル構成 date a_id b_id c_id a_count ■table b のテーブル構成 date a_id b_id c_id b_count value 上記の2つのテーブル構成から、 ■date a_id b_id c_id毎の集計データ date a_id b_id c_id a_count b_count value を抽出するSQLが知りたいです。 table aにあって、table bに存在しない。又は逆もある為、 union しかないと思うのですが、思いつきません。。

    • ベストアンサー
    • MySQL
  • データの抽出およびデータ件数

    こんにちは。お世話になっております。 お忙しい中恐縮ですが、アドバイスを頂戴出来ればと投函させていただきます。 siwake: no id group_type 1  2  未分類 2  1  未分類 3  1  売上 4  1  仕入 5  2  売上 6  1  仕入 group_select: no id group_type 1  1  未分類 2  1  売上 3  1  仕入 4  2  未分類 5  2  売上 以上のようなテーブル(shiwakeは日々蓄積されるデータ。group_typeは基本となるべく区分用データ)があり(各idはそれぞれのデータを紐付けるためのもの)、下記のようにgroup_selectにてidを検索した際、group_typeを表示、かつshiwakeテーブル内にある、同じidで登録のある、group_typeの件数を表示させたく考えてます。 id=1を検索 group_type 件数 未分類   1 売上    1 仕入    2 そこで、これまで検索に関し、多くのアドバイスを頂いていることから下記コードを記述してみましたが、エラーもないまま結果が返ってきません。 毎度お恥ずかしい質問で恐縮ですが、今一度ご指導いただければと、投函させていただきました。 お忙しい中恐縮ですが、宜しくお願い申し上げます。 $sql = "select FG.`no`, FG.`id`, FG.` group_type`, F.`no`, F.`id`, count(F.`no`) as `count` from `siwake` AS F right join `group_select` AS FG on FG.`no` = F.`id` where FG.`id` = '$id' group by FG.`no` order by FG.`no` desc";

    • ベストアンサー
    • MySQL
  • 3つのテーブルの処理について

    下記のようなテーブルがあったとして、 テーブルAを基準に考えたいのですが、、、、 テーブルAに付加する形でテーブルBのデータのidカウント数が最も少なく、idが同じもの中でdate日が一番新しいデータを表示し、古いものから並べかえかつテーブルCにidがあるものは一番最後にくるという風に並べかえたいのですが、無理でしょうか? 現在下記のようなSQLを考えていますが、うまくいかないです。。 select * from A left join(select id,case when count(id)=0 then 0 else count(id) end AS cnt FROM B group by id order by date) as b on A.id=b.id left join(select id from C) as c on A.id=c.id order by c.id desc,b.cnt; エラー↓ in the GROUP BY clause or be used in an aggregate function テーブルA id | name | comment| 1 あ   おい 2 い   えい 3 か   テス テーブルB id | event | date | 1 test1 2005/1/4 2 test1 2005/1/4 1 test2 2005/3/4 2 test2 2005/3/4 1 test3 2005/5/4 テーブルC id | 1 理想の結合データ id | name | comment| cnt | date | 3 か   テス 0    2 い   えい 2  2005/3/4  1 あ   おい 3 2005/5/4

  • テーブルごとのカウント

    PHP5.2+mysql 5.0.45で開発を行っております。 SQLに関する質問なのですが 以下のことが可能かどうかご教授いただきたく。 4つのテーブルがあります。 (例は適当です。項目の名称等は無視してください。) テーブルA ID Name Kana テーブルB ID NameID Pref City テーブルC ID NameID Tel Fax テーブルD ID NameID email CellPhone とします。 A.ID=1000の時各テーブルのレコード数が A:B:C:D=1:3:2:2となっています。 SQLの出力結果として A.ID A.Name A.Kana B.Count(ID) C.Count(ID) D.Count(ID) という、6項目を出力したいのですが 方法がわかりません。 試してみたのは select A.ID,A.Name,A.Kana,Count(B.ID),Count(C.ID),Count(D.ID) from A left join B on A.ID = B.NameID left join C on A.ID = C.NameID left join D on A.ID = D.NameID where A.ID = 1000 group by A.ID,A.Name,A.Kana ですが 結果、 A.ID = 1000 A.Name = Name A.Kana = Kana Count(B.ID) = 3 Count(C.ID) = 3 Count(D.ID) = 3 となってしまいます。 冷静に考えるとそうなんですが・・・ もしうまく結果を取得できる方法があればご教授いただきたく よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 重複データを表示しない

    はじめまして。質問させて頂きます。 この教えてGoo!のような質問掲示板を、下記のようなカラムにて作っているのですが、例えば、登録ユーザーさんのがこれまでどのような回答をしたか?を閲覧出来るページを作る場合、普通にselectしただけでは、同じ質問に2度回答してあるときなどは、複数表示されてしまいますが、これを避けるためにはどのようなSQL文にしたら宜しいのでしょうか? SQLを触り始めて間もないこともあり、調べようにも適切なキーワードが思いつかず、なかなか目的の情報にたどり着かないため投函させていただきました。宜しくお願い致します。。 help(質問テーブル) no id subject contents date answer(回答テーブル) no help_no id answer date ※help_noは、質問テーブルのnoと紐づけるためのカラムです。

    • ベストアンサー
    • MySQL
  • コメント欄のタイトルに決まったマーク(タグ)

    ブログのコメント欄のカスタマイズをしています。 コメント投稿した際に、 タイトルの頭に決まったマークを挿入するようにしたいのです。 (現時点では、各コメントが各テーブル分けされているわけではないので、どこまでが●さんの投稿か区別しにくいので、そのマークで見分けが付くようにしたいのです) いろいろして、挿入出来たのですが、 入力したタイトルそのものが表示されませんでした。 挿入タグの検索もしたのですが、ヒットせず。 (検索する言葉が分からないのもあります) <div id="comment<%comment_no>" class="commentbody" > <h4 class="comment-Start"><%comment_title></h4> か、 <td><label for="name">Title</label></td> <td><input id="subject" type="text" name="comment[title]" size="25"> </td> のどちらかにタグを付け加えればいいのだろうと思うのですが、 決まったマークを挿入する際のタグを教えていただけないでしょうか? 「 ★ 」「 ・ 」「 ■ 」とかではなく、 「 &hearts; 」を入れたいと思っています。 無理なのでしょうか? よろしくお願いします。

  • 3つのテーブルからのデータ抽出

    こんばんは。 久しぶりの投函ですが、以下の内容を処理することが出来ずに悩んでおります。 テーブルを結合して・・というのは、分かるのですが、ネットで検索してもその殆どが2つのテーブルに関するものなので、その設定が出来ずに時間を費やしている状況です。 お忙しい中恐縮ですが、アドバイスなど頂戴できたら幸いです。 table:main id name 1 たかし 2 しげる 3 あけみ 4 ひろみ 以下のtableのid、p_idは、mainTBのidを指しています。 table:frend no id p_id 1 2  3 2 4  1 3 1  2 4 2  4 5 3  1 以下のtableのidは、mainTBのidを指しています。 table:comment no id naiyou 1 3 よろしく 2 4 こんにちは 3 2 おめでとう 4 3 楽しい 以上のテーブルが存在し、mainのid、しげるを検索した際、 frendTBに参照し、しげる(id=2)に該当するp_id(この場合、3、4)を探し、且つcommentTBにあるidである、naiyouを表示したいと考えてます。 実際の表示はこんな感じ・・ しげる(id=2)を検索した場合、 よろしく  あけみ こんにちは ひろみ 楽しい   あけみ 以上、アドバイスだけでも結構です。ご指導のほど宜しくお願い申し上げます。

    • ベストアンサー
    • MySQL