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

このQ&Aのポイント
  • MySQL 4.1を使用して、テーブル間でデータを取得し、件数を表示する方法について質問します。
  • 例えば、マイミクを管理するテーブルから特定の条件に合致するデータを取得し、相手方の名前と件数を表示したいと考えています。
  • これまでのアドバイスを応用できずに困っているため、ご指導いただけると助かります。
回答を見る
  • ベストアンサー

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

こんばんは。お世話になっております。 ココのところ、件数を取得する質問ばかりですが、スキル不足故にこれまでの有難いアドバイスを応用出来ずにお恥ずかしい限りですが、改め今回もご指導いただければと投函させて頂きます。 イメージ的にミクシィのマイミク一覧の各々のマイミク件数の表示と同じような事がしたいと考えてます。(MySQL 4.1) 実際のテーブルとは違いますが、マイミクを例に取ったので・・ table:member id name 1 哲也 2 淳二 3 真由美 4 弘子 table:friend(マイミク登録状況を示すテーブル) no id f_id 1  2  3 2  1  2 3  3  1 4  4  2 5  2  1 6  4  1 7  4  3 8  2  4 ※id、f_id共にmemberテーブルのidと紐付け そこで、テーブルfriendのidを4という条件で検索した時、 その4の相手方であるf_idをmemberテーブルのnameと共に一覧表示し、かつ、テーブルfriendにおいて、そのf_idをidに差し替え、相手方のf_idの件数を同時に表示させたいと考えてます。 上記テーブルの場合、以下のような感じ。 淳二  3 哲也  1 真由美 1 冒頭にも述べましたが、これまで多くのアドバイスを頂戴しながらも、似たような質問にてお恥ずかしい限りですが、描いている構想を進めるたびに壁に突き当たっている次第です。お忙しい中恐縮ですが、ご指導いただければ幸いに思います。宜しくお願い申し上げます。

  • MySQL
  • 回答数5
  • ありがとう数6

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

  • ベストアンサー
回答No.5

検索結果が、0件になっていますか? PHPには詳しくないですが、SQL中の変数は、「'」(単一引用符)で囲む必要があると聞いたことがあり、ネット上に公開されている例を見てもそうなっています。 where id = $id ↓ where id = '$id' とすればどうでしょうか? また、どの部分に問題があるかは、#1で示したようにSQLを分解して確認するといいと思いますよ。

sadacha
質問者

お礼

chukenkenkou様 こんばんは。早速のお返事を有難う御座います。 先にお伝えしたSQLで検索結果は正常に呼び出されております。 where id = '$id' に関しても、ご指摘のようにも幾度か試しておりましたが、該当のカラムが数値型の場合($idが数値の場合?)、特に問題がないようです。 ('で括った方が尚良いことにはなりますね。) >また、どの部分に問題があるかは、#1で示したようにSQLを分解して確認するといいと思いますよ。 そうですね。当初順を追っての説明を頂いているのでその説明を参考に、改めて見直してみたいと思います! それでは、また改めてお返事(ご報告)いたしますので、宜しくお願い申し上げます。

sadacha
質問者

補足

chukenkenkou様 こんばんは。お世話になっております。 あれから試行錯誤を繰り返しておりますが、未だf_idを取得できずにおり、PHP側にて最初に抽出すべくf_idを配列に入れ、その後、chukenkenkou様からご指導いただきましたSQLにて呼び出したデータに付加する形で、とりあえずの結果を得ることが出来ました。 ソース的にはこんな感じ。 $sql = "SELECT no, id, f_id FROM friend where id = '$id' order by no desc"; $result = mysql_query($sql); $rows = mysql_num_rows($result); while($row = mysql_fetch_array($result)){ $f_no[] = $row["f_id"];//f_idを配列に格納 } ~中略~ $sql ="select `name`, `count` from `member` as m inner join(select min(no) as `no`, id, f_id, count(f_id) as `count` from `friend` where id in(select f_id from `friend` where id = '$id') group by id) as x on m.id = x.id order by no desc"; $result = mysql_query($sql); $rows = mysql_num_rows($result); $count_id = 0; while($row = mysql_fetch_array($result)){ $count_no = $count_id++; $f_id = $f_no[$count_no]; ~以下省略~ 本来であれば、全てSQLで処理すべきなのでしょうが、このようなソースで結果を得ることが出来ましたが、検索する際の効率?を考えると(自分のスキル不足から来る場当たり的な対処により)、データが多くなってきたときに不安を感じます。 chukenkenkou様からして、以上のようなソースを見て何かご指摘はありますでしょうか? 度重なる質問で恐縮ですがご意見のほど宜しくお願い申し上げます。

その他の回答 (4)

回答No.4

>お礼してから3日(現在11/30 22:36)ほど経っていますが、未だ解決しておりません。 >これ以上の分かりやすい説明はない!といった声が聞こえてきそうですが、はまりにはまって描いている結果を得られる気配すら感じない 最新のSQLは、どういう記述になっているのか教えてください。 また、テストで使用しているデータは、最初の質問時と同じでしょうか?もし、違っているなら、最新のテストデータを教えてください。 また、どういう結果を期待しているのに、現状のSQLではどうなるのかも、できれば教えてください。

sadacha
質問者

お礼

chukenkenkou様 こんばんは。お世話になっております。早速のお返事を有難う御座います! テストで行っているテーブルはカラム数こそ違いますが、質問時と同名のカラムで行っています。 以下は、現在のSQLです。抽出したいデータは4つなのですが、f_idだけが、(現時点で)何をやっても抽出できない状況です。 (上手くいかずに修正しては元に戻すの繰り返しで、当初お教えいただいたSQLとほぼ同じです。) $sql ="select `name`, `image`, `count` from `member` as m inner join(select min(no) as no, id, f_id, count(f_id) as `count` from `friend` where id in(select f_id from `friend` where id = $id) group by id) as x on m.id = x.id order by no desc "; ~中略~ echo "<p>".$row["f_id"]."/".$row["image"]."/".$row["name"]."/".$row["count"]."</p>";

sadacha
質問者

補足

chukenkenkou様 こんにちは。お世話になっております。 先日開示したスクリプトに多少の不安はありますが、当初ご質問させていただいた結果は、chukenkenkou様のアドバイスにより得ることが出来ましたので、解決済みとさせていただきます。 ありがとう御座いました。

回答No.3

#2回答で、一部、不正確な回答をしてしまいました。 friend表のno列は、group byに指定しないため、min(no)あるいはmax(no)といった指定をしないと、MySQLでは結果は不定になってしまいます。他のRDBMSでは、エラーになります。 http://dev.mysql.com/doc/refman/4.1/ja/group-by-hidden-fields.html?ff=nopfpls select `name`,友人数 from `member` as m inner join(select min(no) as no,id,count(f_id) as 友人数 from `friend` where id in(select f_id from `friend` where id=4) group by id) as x on m.id=x.id order by no desc ;

sadacha
質問者

お礼

chukenkenkou様 こんばんは。早速のお返事、並びにご丁寧なご説明を有難う御座います。 取り急ぎご挨拶まで。また改めてご報告させて頂きます。 貴重なお時間を割いてしまっていることに感謝いたします。

sadacha
質問者

補足

chukenkenkou様 こんばんは、お世話になっております。 あれからchukenkenkou様のアドバイスのもと、今回から初めて行っているサブクエリの理解を深めながら、描いている結果を得られればと、試行錯誤を繰り返していますが、依然、f_idを得ることが出来ない状態です。 この場において、解決できないところに恥ずかしい気持ちもありますが、更なるヒントでも頂戴出来れば幸いです。宜しくお願いいたします。

回答No.2

集計(集合)関数、列の数値・文字演算などを行うと、RDBMSから返却される列名は、RDBMS独自のすごく長い名前、しかも特殊記号を含んでいたりで、アプリケーション側から参照するには、「as 別名」の別名で参照した方が簡単です。「as」は、後から標準SQLで規定されたこともあり、省略できるRDBMSが多いです。 「count(f_id) as 友人数」も、その外側のクエリ、あるいはアプリケーションでの参照ができるようにするため、別名として「友人数」を付けています。 >friendテーブルのf_idも出す f_idは、memberのidと同一値ですよね。したがって、以下のクエリでは、member表のid列を、selectの選択リストに追加するだけです。 select m.id,`name`,友人数 from `member` as m inner join(select id,count(f_id) as 友人数 from `friend` where id in(select f_id from `friend` where id=4) group by id) as x on m.id=x.id order by 友人数 desc,m.id ; もし、これがfriend表から引き継ぐ必要がある列なら、インラインビュー(xという名前を付けている)のselectの選択リストに追加することになります。 friend表のno列でソートしたいとなれば、その列を一番外側のクエリまで引き継ぐ必要があります。 select `name`,友人数 from `member` as m inner join(select no,id,count(f_id) as 友人数 -- ここでno列を指定 from `friend` where id in(select f_id from `friend` where id=4) group by id) as x on m.id=x.id order by no desc -- ここでno列、あるいはx.noといった名称で指定可能 ;

sadacha
質問者

お礼

chukenkenkou様 こんばんは。お世話になっております。 最後に補足欄にてお礼してから3日(現在11/30 22:36)ほど経っていますが、未だ解決しておりません。 これ以上の分かりやすい説明はない!といった声が聞こえてきそうですが、はまりにはまって描いている結果を得られる気配すら感じないのが正直なところです。お忙しい中恐縮ですが、今一度ご指導頂戴出来れば幸いです。

回答No.1

順を追って、クエリを作っていきましょう。 (1)テーブルfriendのidを4という条件で検索、その4の相手方であるf_idを得る select f_id from `friend` where id=4 ; member表のname列への変換は、一番最後にしておきましょう。 (2)テーブルfriendにおいて、そのf_idをidに差し替え、相手方のf_idの件数 (1)のクエリを、サブクエリで使用しています。 select id,count(f_id) as 友人数 from `friend` where id in(select f_id from `friend` where id=4) group by id ; (3)memberテーブルのname列で変換 (2)のクエリをインラインビュー内で使用しています。 表示順をどうしたいのか不明だったので、友人数の多い順、友人数が同じならmember表のid順としています。 select `name`,友人数 from `member` as m inner join(select id,count(f_id) as 友人数 from `friend` where id in(select f_id from `friend` where id=4) group by id) as x on m.id=x.id order by 友人数 desc,m.id ;

sadacha
質問者

お礼

chukenkenkou様 こんばんは。お世話になっております。 順を追っての詳しい説明を有難う御座います! アドバイスいただける内容は全て感謝しておりますが、 このような順を追っての説明には、本当ありがたく感じております。 そこで、大変お恥ずかしい質問なのですが、コード内にある「友人数」とは、どのようなものになるのでしょうか? 説明のみならず、コードの記載も有難く思っている次第ではありますが、この説明を理解しながら進めてみたいと思っており、お返事にも多少のお時間をいただくかと思いますので、ご理解いただくと同時に、今一度ご説明いただければ幸いに思います。

sadacha
質問者

補足

chukenkenkou様 度々すみません。先ほどの「友人数」は分かりました。お騒がせしました。 そこで、当初の質問で、検索結果を出す際、以下のように、friendテーブルのf_idも出すにはどのようになるのでしょうか? f_id name count 2  淳二  3 1  哲也  1 3  真由美 1 今回のサブクエリなるもの、初めて使うことになり、このf_idの出すタイミング?(コードの記載位置?)によって理解出来るような気がしてきました。 それと、 order by 友人数 desc,m.id ですが、friendテーブルのnoの降順にするには、どのようになるのでしょうか? この、「友人数の多い順、友人数が同じならmember表のid順」というのも大変貴重で「なるほど・・」とは思いつつ、ただ単にorder by no desc とやっても上手くいかないもので・・・。 お忙しい中、お手数お掛けし申し訳ありませんが、宜しくお願い申し上げます。

関連する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,PHPを使いデータとデータ件数を取得する関数

    よろしくお願いします。 このようなテーブルがあります。 テーブル名GAME id name    price  genre_id  comment 1 FF1    100  1  おもしろい 2 カービー 200 3 丸い赤 3 バイオ   250 2 怖い : : : : : テーブル名GENRE genre_id genre_name 1 RPG 2 ホラー 3 バイオ このようなテーブルがあるとして、 検索したいカラム(id,name,g_id,comment)に対して検索キーワードに部分一致をしたものデータからソートしたいカラムと昇順降順のようにソートしページ数から (ページ数-1)*10+1 ~ ページ数*10 最終ページのときは (ページ数-1)*10+1 ~ 最終ページ の部分のデータを取得する関数を作りたいです。表示するデータは id name genre_name です。 ページャーも使うので検索カラムにたいして検索ワードに部分一致した結果件数も戻り値として返したいです。 上記のsql文を教えてください。 またデータと結果件数を返す関数を作ることは可能でしょうか? 関数の引数は以下のように5つにするつもりです。 function getList($search_column,$search_word,$sort_column,$sort_order,$page_number) どうかご教授ください。

    • 締切済み
    • PHP
  • テーブルの内容とテーブルのカラムの件数

    以下のようなテーブルがあります。 そのテーブルの内容と、そのテーブルのあるカラムの件数を条件にして抽出したいのですが、どのように指定すればよろしいでしょうか? テーブルA id(int) AUTO_INCREMENT, user_id(varchar), price(int), date(datetime) 表示したい一覧 user_id | date | price A | 2014-03-10 10:00:00 | 2600 B | 2014-03-11 11:00:00 | 2720 A | 2014-03-13 12:00:00 | 2500 C | 2014-03-14 15:00:00 | 2860 B | 2014-03-18 13:00:00 | 2450 A | 2014-03-19 19:00:00 | 2550 ・・・ などのレコードがあった場合、 user_idが同じ場合のレコード数が2~5の場合等を抽出したいと思います。 うまく表現できませんが、このような場合の抽出の仕方をわかる方、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQL文で他テーブルの件数も同時に求めたい

    SQL文について教えてください。(DBはSQLサーバー2000です。) 以下のように2つのテーブルがあります。Aテーブルのフィールド項目の抽出と、AテーブルのIDフィールドと同じ値のBテーブルの件数を同時に抽出したいのですが、どのように書いてよいか分かりません。恐れ入りますが、教えていただけないでしょうか? テーブルA  ID name Age -------------- 1  太郎 20 2  二郎 35 3 花子 26 テーブルB ID memo ------------------ 1  私は男です 1  東京に住んでます 2  友達が3人います 3 私は彼氏がいます 3  先日TDLに出かけました。 3  ランチはカレーでした。 要約すると、Aテーブルの全情報とテーブルBの件数を同時に抽出したいのです。以下のようなイメージです。 name Age テーブルB件数 ------------------- 太郎、20、 2 二郎、35、 1 花子、26、 3 よろしくお願い致します。

  • 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
  • データの抽出およびデータ件数

    こんにちは。お世話になっております。 お忙しい中恐縮ですが、アドバイスを頂戴出来ればと投函させていただきます。 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
  • 複数のテーブルに跨る集計

    こんばんは。お世話になっております。 テーブル(member) id id_name name  1 takashi さんま 2 sayuri きゅうり 3 akemi  とまと テーブル(data) id date 2 07-1-20 3 07-1-20 2 07-1-20 1 07-1-21 2 07-1-21 3 07-1-21 以上のようなテーブルがあり、下記のように、テーブルdataのidをカウントし、多いもの順に結果を表示させたいのですが、このような場合のソースが分かりません。 結果 きゅうり 3件 とまと  2件 さんま  1件 似たような質問をされている方も過去に多くあるようですが、私のケースとどれが適しているかさえも分からず投函させていただきました。 お忙しい中恐縮ですが、説明のあるサイト、またはアドバイスなどご指導いただけたら幸いです。宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • 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
  • SQL GROUPで件数の一番多いレコードのみ取る

    SQL GROUPで件数の一番多いレコードのみ取る ORACLE10です。 次のようなテーブルがあります。 USER -----------テーブル名 ID,NAME,DATA----列名 1,A,any 1,A,any 1,B,any 2,C,any 3,D,any このテーブルから、IDをGROUPにして、さらに、一番使用頻度の多いNAMEを取得したいのです。 表示したいのは、IDとNAMEです。 つまり、取得結果例は次のようになります。 取得結果例 ID,NAME----列名 1,A 2,C 3,D SQL文をどのように作れば可能でしょうか? ちなみに、IDやNAMEのマスタテーブルはありません。 自分では、「(select ID, NAME, count(*) from USER group by ID, NAME) COUNT」で、COUNTを内部テーブルにして、グループ内で一番多いcount(*)をmaxで取得してみようかと思ったんですが、そこからアイデアが出ませんでした。

  • 名寄せして件数を取得する事は可能でしょうか?

    リスト化した文字列が含まれているレコードをグループ化し、 件数を表示したいのですが・・ select nayose,count(*) from test where name like '%田%' だと、田が含まれる件数しか取得できず・・ 例えば、以下のようなnayose_listテーブルがあった場合、 nayose_listの漢字を含む件数を取得できないでしょうか? nayose_list 田 人 一

    • ベストアンサー
    • MySQL