- ベストアンサー
検索条件に関して
こんばんは。お世話になっております。 id auto_increment randam ランダム数値 id_key 1または2を登録 例えですが、上記のようなカラムがあるテーブルがあり、id_keyに1と登録されているレコードの一覧を検索結果として表示させたいのですが、その際、randamに登録されている数値が同じであるレコード数も同時に検索結果として表示させたいと考えています。 例えですが、具体的には… id randam id_key 1 25252 1 2 25252 2 3 25252 2 4 34535 1 5 57234 1 以上を結果表示として id 1 3件 id 4 1件 id 5 1件 このように、phpにてブラウザに表示させたいと考えているのですが、randamにランダム数値を登録している事もあり、検索条件として同じ数値がある場合の条件設定が分からずに居る次第です。 この数日間、どうにかならないものか?と、ない頭を捻ってはいるものの、思いつく事と言えばif文の嵐になってしまって…。上手く説明できずに分かりにくい日本語になっていますが、ヒントだけでも頂戴出来れば幸いです。 お忙しい中恐縮ですが、宜しくお願い致します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 id_keyが1の値のみを抽出し、かつ、id_keyが1の値のrandamの件数を抽出するには、下記の様にSQL文を発行してみては如何でしょう? select id_key,count(randam) as randam_num from hoge_table where id_key = '1' group by randam order by id_key という具合にSQL文を発行すると、 where区でid_keyが1のデータのみを抽出し、かつ、randamをグループ化し、グループ化したrandamをcount関数でカウントしているので、 恐らくご希望の結果が得られると思います。 なお、カウントしたrandamの値をPHPで表示させるには、結果IDをmysql_fetch_array関数で配列に代入し、配列の添え字にはSQL文で発行したカラム名で取り出します。 phpでsql文を発行し、配列に代入するには下記の通りになります。 //mysql文の発行し、結果IDを『$hoge_list』に代入します //※${connect_id}はDB接続IDです。省略も可ですが、付けとけば確実です。 $hoge_list = mysql_query ("select id_key,count(randam) as randam_num from hoge_table where id_key = '1' group by randam order by id_key",${connect_id}); //結果IDを配列『$hoge_array』に代入 $hoge_array = mysql_fetch_array(${hoge_list}); //配列からブラウザに出力 //id_keyの出力 print "${hoge_array['id_key']}"; //randamのカウント数を出力 print "${hoge_array['randam_num']}"; という感じになると思います。 ちょっとわかりづらいですが、試してみてください。 ちなみに、PHPでの出力はechoでもprintでも大丈夫です。私はperlを使っていたので、printと表記するのになれてしまっているだけでせう。
その他の回答 (4)
- kabilunlun
- ベストアンサー率34% (155/446)
AS CNTはそれ以降CNTという列名で使用できるようにする記述です。 CNT自体に意味はなくCOUNT(*)の別名なので、AでもBでも構いません。
お礼
kabilunlun様 こんばんは、早速のお返事有難う御座います! お二方の貴重なヒントを元に、描いていた結果を表示させる事が出来ました! 初めて見るものもありましたが、今後に向けても貴重なヒントを下さったように思えます。 有難う御座いました。
- kabilunlun
- ベストアンサー率34% (155/446)
#1です。訂正です。 idはauto_increment(重複なし)なので、「DISTINCT」は不要でした。
お礼
kabilunlun様 はじめまして、こんばんは。 ご丁寧なアドバイスを有難う御座います。 只今、お二方からご教授いただいたコードを基に動かしておりますが、CNTやAS CNTとはどのようなものになるのでしょうか? 初心者の私からして初めて見るもので、検索して調べようにも、検索キーワードをどのようにしたら良いかと・・・お手数お掛けいたしますが宜しくお願い致します。
- nikuq
- ベストアンサー率22% (8/36)
検索した結果にrandamの各値の合計数を出したいだけならば、下記の様にすればでますよ。 select id,count(randam) as randam_num from hoge_table group by randam order by id こうすると、randamをグループ化して同じ数字はひとつのカラムとして抽出されます。その際に、count関数でrandamの同じ数字をカウントするので、 検索結果表示と同じ結果が得られます。 検索結果は id | randam 1 | 3 4 | 1 5 | 1 となると思います。 やってみそ! 尚、参考なるかわかりませんが、group byに関するMySQLのマニュアルURLも のせますね。
お礼
nikuq様 はじめまして、こんばんは。ご丁寧なアドバイスを有難う御座います。 お恥ずかしいのを覚悟でお伺いしますが、randamの件数の出力は、どのように記述したら良いのでしょうか? id_keyが1のレコードのみを出力させる事が出来たのですが、件数を表示させる事が出来なくて・・・ count関数なども調べてみたものの、結果は1件と出てしまうのです。 お忙しい中恐縮ですが、宜しくお願い致します。
- kabilunlun
- ベストアンサー率34% (155/446)
MySQLは使用したことがないのですが、文法はOracleと変わりないようなので、 SELECT A.id,B.CNT FROM (SELECT DISTINCT id,randam FROM テーブル名 WHERE id_key = 1) A, (SELECT randam,COUNT(*) AS CNT FROM テーブル名 GROUP BY randam) B WHERE A.randam = B.randam で、できないでしょうか。 Aは重複なしのidとrandamをid_keyが1という条件で抜き出し、 Bはrandamでグループ化してrandamごとの件数を求めます。 最後にrandamをキーにしてAとBをつなげて、idと件数を求めます。
お礼
nikuq様 こんばんは。早速のご回答、かつ事細かな説明を有難う御座います。 これまで、mysql_fetch_arrayを使った事が無く、手持ちの本を見ながらでしたが、無事、描いていた結果を表示させる事が出来ました。 この手の質問に、スクリプトを記述するという面倒な対応に、nikuq様をはじめ、ご親切にご回答くださる皆様には感謝しております。有難う御座いました。