• ベストアンサー

データの抽出およびデータ件数

こんにちは。お世話になっております。 お忙しい中恐縮ですが、アドバイスを頂戴出来ればと投函させていただきます。 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
  • 回答数4
  • ありがとう数5

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

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

見逃してしまっていたのですが、このSQLで、siwake表のno列を得てはだめです。 標準SQLや殆どのRDBMSでは、group by指定時にselectの選択リストで指定できるのは、group byで指定した列か、集計(集合)関数だけです。 MySQLでは、この部分に拡張仕様を持っていて、group byでグループ化した結果、一意になるなら、group byで指定していない列を指定できるようになっています。 もし、一意にならないなら、結果は保証されません。 http://dev.mysql.com/doc/refman/4.1/ja/group-by-hidden-fields.html?ff=nopfpls 例を示すと、次のようになります。 <例1> select c1,count(*) from t1 group by c1 →どのRDBMSでも指定可能 <例2> select c1,c2,count(*) from t1 group by c1 →c2を指定することは、標準SQLでは違反であり、殆どのRDBMSでは文法エラーになる。 MySQLではこの指定は文法エラーにならず、「group by c1」でc2も一意になるなら指定してよい。一意にならないなら結果は保証しない。

sadacha
質問者

お礼

chukenkenkou様 こんばんは。度重なるご指導を有難う御座います。 回答いただいた直後から、お教えいただいた内容の理解を深めようとしておりましたが、いまいち理解に乏しく、ならば別々にgroup_typeの種類、件数を取得して配列に・・・と回り道?などと思いながらも、試行錯誤を繰り返しておりますが、php側で一向に上手くいく気配が見れずに居る次第です。 chukenkenkou様のおっしゃるように、今回のケースは上手く行かないのでしょうか・・・すみません。折角アドバイスを頂いているにも関わらず理解し切れておりません。 ちなみに、現在のSQL文は以下のようになっており、shiwakeテーブルに登録のないデータでも、group_selectテーブル内にあるグループの表示までは出来ましたが、全て同じ件数(一番多い件数)となっております。 ご指摘下さった件に関して理解が乏しく、自分なりに歯痒いながらも、ここまで来ているのに・・という思いです。 説明不足なところも多々ありますが、引続きアドバイスを頂戴出来れば幸いです。お忙しい中恐縮ですが、宜しくお願いいたします。 $sql = "select FG.`no`, FG.`id`, FG.`group_type`, count(F.`id`) as `count` from `siwake` AS F right join `group_select` AS FG on FG.`id` = F.`id` where FG.`id` = '$id' group by FG.`group_type` order by F.`no`";

sadacha
質問者

補足

chukenkenkou様 こんばんは。お世話になっております。 お騒がせした箇所ですが、これまで多くの方にアドバイスいただいたソースを参考に、試行錯誤ながら以下のソースにて解決出来ました。 色々とご指導いただき感謝しております。有難う御座いました。 $sql = "select FG.`no`, FG.`id`, FG.`group_type`, F.`id`, count(F.`group_type`) as `count` from `siwake` AS F right join `group_select` AS FG on FG.`group_type` = F.`group_type` where FG.`id` = '$id' AND F.`id` = '$id' group by FG.`group_type` order by F.`no`";

その他の回答 (3)

回答No.3

最新のSQLは、どういうSQLになっているのでしょうか? 質問で提示されたSQLに、#1で指摘した内容を反映したSQLならば、siwakeにないデータ('売掛'なのか'買掛'なのか分かりませんが。。。)も、0件として表示されるはずですが?

  • calltella
  • ベストアンサー率49% (317/635)
回答No.2

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  売上 上記のsiwakeテーブルにもgroup_selectテーブルにも 一意となる値がどこにもありません。 つまりsiwakeの1レコード目を例に取ると [no:1 id:2 group_type:未分類] これをgroup_selectテーブルから特定しようとすると [id:2 group_type:未分類]の2つのキーが必要になります。 キーが2つでもご希望の様な事は可能ですが汎用性を考えるとテーブルを作成し直した方が楽です。 以上を踏まえてテーブルを再作成 siwake: id group_type 4  未分類 1  未分類 2  売上 3  仕入 5  売上 3  仕入 group_select: no group_type 1  未分類 2  売上 3  仕入 4  未分類 5  売上 以下のSQLを実行 select group_select.group_type,count(*) from siwake left join group_select on siwake.id=group_select.no group by group_select.no ・・・・と、ここまで書いて結果が違うので気づいたのですが 「group_selectにてidを検索した際、group_typeを表示、かつshiwakeテーブル内にある、同じidで登録のある、group_typeの件数」 ってのを見逃しておりました。 それなら 「SELECT group_type,count(no) FROM `siwake` where id='1' group by group_type」 ↑これでご希望の結果になりますが?

sadacha
質問者

お礼

calltella様 はじめまして、こんばんは。順を追ってのご説明を有難う御座います。 投函時の説明不足だったのですが、下記のようなテーブル構成があった際、group_typeテーブルに登録がある分類がshiwakeテーブルになかった場合は、0とカウント表示させたく思っております。 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  売上 6  1  売掛 結果:id=1 で検索した場合 未分類 1 売上  1 仕入  2 売掛  0 当初回答を頂いてから、試行錯誤を繰り返していますが、思うような結果を未だ得られずにおります。お忙しい中恐縮ですが、引続きご指導いただければ幸いです。

回答No.1

やりたいと言っていることと、SQLでやろうとしていることが合っていませんが? このSQLは、コードをコピー&ペーストしたものですか?そうであれば、構文エラーですけど? 「select FG.`no`, FG.`id`, FG.` group_type`, F.`no`, F.`id`, count(F.`no`) as `count`」 →「FG.` group_type`」の部分で、列名の先頭に空白が入っています。 やりたいことと、SQLが違っている部分は、次の通り。 (1)「order by FG.`no` desc」→「order by FG.`no`」では? (2)「on FG.`no` = F.`id`」→「on FG.`id` = F.`id`」 (3)(2)に加え、id列だけでは行を一意に絞り込めないので、「on FG.`id` = F.`id` and FG.`group_type`=F.`group_type`」の条件が必要。

sadacha
質問者

お礼

chukenkenkou様 こんばんは。いつもお世話になっております。 早速のアドバイスを有難う御座います。 ご指摘の、1、2は私のミスで、投函後に修正を済ませておりましたが、お蔭様をもちまして、3の記述で無事検索結果を返すことが出来ました。 そこで、追加質問のようで恐縮ですが(単に投函する際の説明不足)、 group_selectテーブルにおいて登録済みのデータが、日々登録のsiwakeテーブルにデータがない場合、検索結果で、 group_type 件数 未分類   1 売上    1 仕入    2 買掛    0 のように、group_selectにデータがあるが、siwakeにはデータがない場合は、0を表示させるにはどのようにしたら良いのでしょうか? 度重なる質問で恐縮ですが、引続きご指導頂けたら幸いです。お忙しい中恐縮ですが宜しくお願いいたします。

関連するQ&A

  • 売上げ件数順のSQLについて

    売上げ件数順のSQLについて ユーザーごとに、日別の売上データを下記のSQLで集計しています。 これを、グループ化を保ったまま、全期間での売上げ件数合計の多いユーザー順に並び替えるにはどうすればよいでしょうか? select w.user_id as user_id, DATE_FORMAT(w.created_at,"%Y-%m-%d") as days,w.type as type, count(*) as num from uriage w group by user_id,type,days order by user_id,days,type; +---------+------------+-----------------+-----+ | user_id | days    | type      | num | +---------+------------+-----------------+-----+ |    1 | 2010-10-15 | カテゴリ1   |  1 | |    1 | 2010-10-15 | カテゴリ2   |  1 | |    1 | 2010-10-15 | カテゴリ3   |  5 | |    1 | 2010-10-16 | カテゴリ2   |  1 | |    1 | 2010-10-16 | カテゴリ3   |  1 | |    2 | 2010-10-15 | カテゴリ1   |  1 | +---------+------------+-----------------+-----+

  • Access 抽出データ件数のカウント更新について

    以下の2つのテーブルを用いて 販売した数を更新したいのですが、 どの様に作成すれば 良いのでしょうか? クエリーテーブルに結果を出力は出来たのですが、 クエリーテーブルではなく、BUSYO_MSTのM_F_countに カウント結果を出すには、どこを直せばいいでしょうか。 UPDATE BUSYO_MST SET M_F_count=( SELECT Count(M_File.key) AS M_F_count FROM BUSYO_MST LEFT JOIN M_File ON BUSYO_MST.Key = M_File.key GROUP BY BUSYO_MST.Key); ========================= << BUSYO_MST >> ID | key | M_F_count ---+-------------- 01 | バナナ | 0 02 | りんご | 2 03 | みかん | 1 << M_File >> ID | key ---+-------------- 01 | りんご 02 | みかん 03 | りんご

  • 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つのテーブルからのデータ取得および件数の取得

    こんばんは。お世話になっております。 ココのところ、件数を取得する質問ばかりですが、スキル不足故にこれまでの有難いアドバイスを応用出来ずにお恥ずかしい限りですが、改め今回もご指導いただければと投函させて頂きます。 イメージ的にミクシィのマイミク一覧の各々のマイミク件数の表示と同じような事がしたいと考えてます。(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
  • 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
  • 2つのテーブルからデータ抽出

    こんばんは。お世話になっております。 以前にも似たような質問を投函させて頂きましたが、知識が乏しく、適切なキーワードが思い当たらず、検索しても目的の情報に辿り着かずに投函させて頂きます。 Aテーブル id | picture   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 1 | aaa.gif 2 | bbb.gif 3 | ccc.gif 4 | ddd.gif 5 | eee.gif Bテーブル id | ma_id | f_id   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 1 |  2  |  3 2 |  3  |  1 3 |  3  |  4 4 |  5  |  2 上記テーブルA・Bのidはindex というようなテーブルがあり、テーブルBの、ma_idおよびf_idはテーブルAのidと同じ分類となっており、テーブルAのidを呼び出した際、 2だったら、3 ccc.gif と、5 eee.gif 3だったら、2 bbb.gif と、1 aaa.gif と、4 ddd.gif のように、テーブルBにおいて、テーブルAで登録されているidが、テーブルBのma_id,f_idのどちらかに登録されていたら、その一方のidと同じ番号となるテーブルAのpictureを抽出したいと考えております。 $manage_id=$_GET["id"]; $sql= "select * FROM B INNER JOIN A ON B.ma_id = A.id OR B.f_id = A.id WHERE ma_id = '$manage_id' OR f_id = '$manage_id' order by (ma_id OR f_id) limit 0,3 "; 現在、以上のようなソースですが、アドバイスなど頂戴できたら幸いです。 尚、バージョンですが、開発時と運用時では違うバージョンになる可能性が大のため、テーブルの設定なども含め、バージョンに囚われない無難な設定法かどうか、もご指摘頂けたら幸いです。 お忙しい中恐縮ですが、宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • 配列データの件数指定表示

    こんばんは。お世話になっております。 テキストファイルに保存してある配列データがあり、そのデータを呼び出したとき、10件なり20件なりの件数を制限してページング処理?を行いたいのですが、その配列にある各データには、タブ区切りで「OK」または「NO」というデータも格納されており、「NO」というデータのみを件数を制限して表示させたいと考えてます。(次ページなり前ページなりでページを変えて表示させたい) //$count テキストファイルに格納された配列のデータ数 //$string 配列データ $lim = 10;//件数制限 $ii=1; for($i=0; $i<$count; $i++){ $category_data = $string[$i]; $category_data = explode(' ',$category_data); if(trim($category_data[5]) == "no"){ $ii++; echo "○○\n";//ここにデータを表示 if($ii > $lim){break;} } } 以上が、実際にローカル上で記述しているスクリプトなのですが、先の説明のように、はじめの10件までは表示させることが出来ましたが、次ページに移動した際、11件目からのデータを取得する方法が思いつくことが出来ず、今日も朝からテストを繰り返している状況です。 このような場合、どのようにしたら宜しいのでしょうか? お忙しい中恐縮ですが、アドバイスなど頂戴できれば幸いです。 ※以下の質問も投函しており、解決済みとしておりませんが、今回の質問の延長線上にあるので、「解決済みになっていない」ことをお気づきの場合、ご了承願えればと思います。 http://oshiete1.goo.ne.jp/qa4281205.html

    • ベストアンサー
    • PHP
  • group化による件数順で表示

    初歩的質問かとは思いますが、下記の後に order by [件数]のように並べ替えをするにはどのようにしたらよいでしょうか。このままくっつけるとダメなようで。 sSQL = "SELECT Author,count(MsgID) as 件数 FROM messages group by Author #access Jetです。

  • 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
  • 複数のテーブルに跨る集計その2

    こんにちは。お世話になっております。 http://oshiete1.goo.ne.jp/qa2684315.html 昨日、上記ページより投函させていただきましたが、その時は解決できたものの、その後の新たなソースの追加で上記ページにある、検索結果表示にある、各々の「件数表示」が出来なくなってしまいました。 当初は単に追加したソースが邪魔してる?などという思いから、色々と設定を変えているものの上手く行かず、現在なんとか件数表示を表示する事は出来たものの、繰返処理(while)の中に新たに、 $id = $row['id']; $sql = "select id FROM data WHERE id = '$id'"; $result = mysql_query($sql); $rows = mysql_num_rows($result); echo $rows; なんて、入れることで対処出来ましたが、この対処法に自信がなく、改めて諸先輩方々にヒントだけでもご指導いただければと投函させて頂きました。 お忙しい中恐縮ですが宜しくお願い致します。 ※通常の?検索ソースは上記ページでご教授いただいた select M.id, M.name, count(M.name) as count from data D inner join member M on M.id = D.id group by M.name, M.id order by count desc を参考にさせていただいております。

    • ベストアンサー
    • MySQL