抽出データのソート方法について

このQ&Aのポイント
  • 開発環境はPHP Version 5.2.11とMySQL (5.0)です。以下のデータがDBに格納されています。
  • 質問文のテーブルに対して、CHIIKIの合計で並び替えたい場合、SELECT文のORDER BY句を次のように設定します。
  • `CHIIKI` ASC, `CNT` DESCの順に指定することで、特殊地帯は必ず一番上になり、その他は一番下になります。
回答を見る
  • ベストアンサー

抽出データのソート方法について

開発環境は以下になります。 ・PHP Version 5.2.11 ・MySQL (5.0) そして、以下のデータがDBに格納されていると仮定します。 TABLE `hogehoge` CHIIKI,GENRE,CNO 特殊地帯,コンビニ,TOSI001 特殊地帯,八百屋,TOSI001 駒込,デパート,TOSI002 池袋西口,ドンキホーテ,TOSI002 駒込,店舗型エステ日本人,TOSI002 巣鴨,魚屋,TOSI002 池袋東口,スーパー,TOSI002 池袋東口,赤札堂,TOSI002 池袋東口,フリーマーケット,TOSI002 巣鴨,ドンキホーテ,TOSI002 その他,質屋,TOSI003 その他,コンビニ,TOSI003 池袋西口,スーパー,TOSI002 池袋西口,赤札堂,TOSI002 特殊地帯,質屋,TOSI001 池袋西口,デパート,TOSI002 池袋東口,ドンキホーテ,TOSI002 目白,コンビニ,TOSI002 このようなテーブルがあるとします。 そこで、 SELECT `CHIIKI` , `GENRE` , `CNO` , COUNT( `CHIIKI` ) AS CNT FROM `hogehoge` GROUP BY `CHIIKI` , `GENRE` , `CNO` ORDER BY `CNO` ASC , `CHIIKI` ASC , `CNT` DESC としますと、以下のような状態に並び変わります。 CHIIKI,GENRE,CNO,CNT 特殊地帯,コンビニ,TOSI001,18 特殊地帯,質屋,TOSI001,16 特殊地帯,八百屋,TOSI001,15 目白,コンビニ,TOSI002,1 駒込,デパート,TOSI002,1 駒込,店舗型エステ日本人,TOSI002,1 巣鴨,魚屋,TOSI002,3 巣鴨,ドンキホーテ,TOSI002,1 池袋西口,スーパー,TOSI002,37 池袋西口,赤札堂,TOSI002,23 池袋西口,ドンキホーテ,TOSI002,18 池袋西口,デパート,TOSI002,13 池袋東口,ドンキホーテ,TOSI002,17 池袋東口,スーパー,TOSI002,15 池袋東口,赤札堂,TOSI002,11 池袋東口,フリーマーケット,TOSI002,3 その他,質屋,TOSI003,4 その他,コンビニ,TOSI003,2 これは、まず「特殊地帯」は必ず一番上、「その他」は一番下、それ以外は各「CHIIKI」の合計が多い順に並べたいというのが希望です。 しかし、CHIIKIの合計で並び替えの方法がわからず困っております。 本来は以下のような状態に並び替えたいのです。 CHIIKI,GENRE,CNO,CNT 特殊地帯,コンビニ,TOSI001,18 特殊地帯,質屋,TOSI001,16 特殊地帯,八百屋,TOSI001,15 池袋西口,スーパー,TOSI002,37 池袋西口,赤札堂,TOSI002,23 池袋西口,ドンキホーテ,TOSI002,18 池袋西口,デパート,TOSI002,13 池袋東口,ドンキホーテ,TOSI002,17 池袋東口,スーパー,TOSI002,15 池袋東口,赤札堂,TOSI002,11 池袋東口,フリーマーケット,TOSI002,3 巣鴨,魚屋,TOSI002,3 巣鴨,ドンキホーテ,TOSI002,1 駒込,デパート,TOSI002,1 駒込,店舗型エステ日本人,TOSI002,1 目白,コンビニ,TOSI002,1 その他,質屋,TOSI003,4 その他,コンビニ,TOSI003,2 どうすれば、SELECT文で並び替えが出来るのか、何卒ご教授ください。 宜しくお願い致します。

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

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

  • ベストアンサー
  • oosaki2
  • ベストアンサー率53% (8/15)
回答No.2

CASE文を使って select `CHIIKI` , `GENRE` , `CNO` , COUNT( `CHIIKI` ) AS CNT, (case when CHIIKI = '特殊地帯' then 0 when CHIIKI = 'その他' then 2 else 1 end) as `CHIIKI_ID` from `hogehoge` GROUP BY `CHIIKI_ID` , `GENRE` , `CNO` ORDER BY `CNO` ASC , `CHIIKI_ID` ASC , `CNT` DESC はどうでしょうか

参考URL:
http://dev.mysql.com/doc/refman/5.1/ja/case-statement.html
kuyatake
質問者

お礼

ありがとうございます。 何とか解決することができました。 1つのセレクト文ではなく、以下のようにしてみました。 $sql_chiiki = "SELECT `CHIIKI` , `GENRE` , `CNO` , COUNT( `CHIIKI` ) AS CNT FROM `hogehoge` WHERE `CNO` LIKE '%002%' GROUP BY `CHIIKI` ORDER BY `CNT` DESC"; $res_chiiki = mysql_query($sql_chiiki); $rows_chiiki = mysql_num_rows($res_chiiki); $i=1; if($rows_chiiki){ while($row_chiiki = mysql_fetch_array($res_chiiki)){ $case .= "WHEN CHIIKI = '".$row_chiiki[0]."' THEN ".$i."\n"; $i=$i+1; } } $sql = "SELECT `CHIIKI` , `GENRE` , `CNO` , COUNT( `CHIIKI` ) AS CNT, (CASE WHEN CHIIKI = '特殊地域' THEN 0 WHEN CHIIKI = 'その他' THEN 2 {$case} END) AS `CHIIKI_ID` FROM `hogehoge` GROUP BY `CHIIKI_ID` , `GENRE` , `CNO` ORDER BY `CNO` ASC , `CHIIKI_ID` ASC , `CNT` DESC"; 上記のようにまずは地域の並び順だけ求めて、それを次のセレクト文で使用する ケース部分の値に代入し、最後は教えていただいたセレクト文で 思っていた通りの表示ができました。 ありがとうございました。

kuyatake
質問者

補足

回答ありがとうございます。 本当に私の説明が下手糞で申し訳ございません。 `CNO`で「特殊地帯」(TOSI001)、「その他」(TOSI003)、それ以外(TOSI002)という風に区分けできております。 問題になる部分は、`CNO`のTOSI002がついている部分についての並び替えとなります。 目白,コンビニ,TOSI002,1 駒込,デパート,TOSI002,1 駒込,店舗型エステ日本人,TOSI002,1 巣鴨,魚屋,TOSI002,3 巣鴨,ドンキホーテ,TOSI002,1 池袋西口,スーパー,TOSI002,37 池袋西口,赤札堂,TOSI002,23 池袋西口,ドンキホーテ,TOSI002,18 池袋西口,デパート,TOSI002,13 池袋東口,ドンキホーテ,TOSI002,17 池袋東口,スーパー,TOSI002,15 池袋東口,赤札堂,TOSI002,11 池袋東口,フリーマーケット,TOSI002,3 このようになってしまう部分を 池袋西口,スーパー,TOSI002,37 池袋西口,赤札堂,TOSI002,23 池袋西口,ドンキホーテ,TOSI002,18 池袋西口,デパート,TOSI002,13 池袋東口,ドンキホーテ,TOSI002,17 池袋東口,スーパー,TOSI002,15 池袋東口,赤札堂,TOSI002,11 池袋東口,フリーマーケット,TOSI002,3 巣鴨,魚屋,TOSI002,3 巣鴨,ドンキホーテ,TOSI002,1 駒込,デパート,TOSI002,1 駒込,店舗型エステ日本人,TOSI002,1 目白,コンビニ,TOSI002,1 のように、`CHIIKI`の合計が多い順に並んでほしいのです。 ・池袋西口(合計91件) ・池袋東口(合計46件) ・巣鴨(4件) ・駒込(2件) ・目白(1件) これが多い順の条件となりますので、これの順序どおりにすると上記の並び順になるということです。 何卒宜しくお願い致します。

その他の回答 (1)

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

問題点・・・ (1)例示の情報だと、CNTが18,16,15・・・となっていますがどういう根拠かわかりません。 (2)CNTでソートしたとしてその他の項目の優先順位がわかりません。 ざっと予測してやるとこんな感じですかねぇ・・・ SELECT `CHIIKI` , `GENRE` , `CNO` ,`CNT` FROM `hogehoge` INNER JOIN ( SELECT `CHIIKI`, COUNT( `CHIIKI` ) AS CNT FROM `hogehoge` GROUP BY `CHIIKI` ) AS sub USING(`CHIIKI`) ORDER BY `CNO` ASC, `CNT` DESC ,`CHIIKI`,`GENRE`

kuyatake
質問者

お礼

回答ありがとうございました。 何とか解決できました。

kuyatake
質問者

補足

申し訳ありません。説明不足でした。 といいますか、最初のテーブル定義が間違いでした。 TABLE `hogehoge` CHIIKI,GENRE,CNO 特殊地帯,コンビニ,TOSI001 特殊地帯,八百屋,TOSI001 駒込,デパート,TOSI002 池袋西口,ドンキホーテ,TOSI002    ・    ・    ・ とありますが、これが 特殊地帯,コンビニ,TOSI001が18件 特殊地帯,八百屋,TOSI001が15件    ・    ・    ・ と大量にデータがあって、それをCNTでカウントして ソートしております。 優先順位としては、 地域が「特殊地域」「各地域」「その他」 →各地域内の優先順位はCNTの合計が多い順 前述のデータに照らし合わせると 「特殊地域」が一番上 各地域内は ・池袋西口(合計91件) ・池袋東口(合計46件) ・巣鴨(4件) ・駒込(2件) ・目白(1件) の順番で、最後が「その他」 という並び方になってほしいのです。 解りづらくて申し訳ありません。 教えていただいたSELECT文を実行してみたところ、 #1052 - Column 'CHIIKI' in field list is ambiguous というエラーになりました・・・直訳すると 地域フィールドがリストの中であいまいだそうです・・(汗) 何卒宜しくお願い致します。

関連するQ&A

  • 池袋について気になっていることがあります。

    前々から不思議に思う事があります。 池袋には何故、東口に西武デパートがあり、西口に東武デパートがあるのでしょうか。 どなとかもしご存知でしたら、ご回答宜しくお願いいたします。

  • VB6で、抽出したデータのソートについて

    はじめまして。 どうしても分からないので、どなたかご教授頂けたらと思います。 VB6で、抽出したデータのソートを行いたいと思います。 大まかな流れは以下の通りです。 Dim objDb As Database Dim objTbl As Recordset   'mdbファイルからデータを抽出   Set objTbl = objDb.OpenRecordset(データ抽出条件式) (1)レコードセットした、objTblにフィールドを1つ追加したい。 (2)その追加したフィールドにデータを入れる。 (3)入れたデータで降順にソートしたい。 どうしても出来ないので、元のmdbから任意のフィールドを取得してきて、 そこに必要なデータを入れてソートしようとしたら、 .updateでmdb自体のデータを更新しないと出来ませんでした・・・ (mdbファイルは更新・変更等の操作を行ってはダメなファイルです。) この後の処理があるので、レコードセットしたobjTbl (もしくはそのコピーでもいいのですが・・・)を使った形で、出来ると良いのですが・・・ どうぞ、よろしくお願いいたします。

  • 取り出したデータのソート方法

    少し複雑な処理で行き詰ってしまいましたので、 お力を貸していただけると幸いですm(__)m 掲示板をLinux + Apache + PHP + MySQL環境で 作成しているのですが、最新投稿のソートがうまくいかず困っています。 現在、1ページに5件の記事を最新投稿が上部になるように表示しています。 クエリ:SELECT * FROM bbs ORDER BY no DESC LIMIT 5 例: ------------ (1ページ目) 投稿No.7 投稿No.6 投稿No.5 投稿No.4 投稿No.3 ------------ (2ページ目) 投稿No.2 投稿No.1 ------------ この表示を 希望例: ------------ 投稿No.3 投稿No.4 投稿No.5 投稿No.6 投稿No.7 ------------ (2ページ目) 投稿No.1 投稿No.2 ------------ のように表示したいのですが、 どのようにクエリを作成すればよいのでしょうか? よろしくお願いいたします

    • ベストアンサー
    • MySQL
  • <select> selectedについて

    ある動的検索結果用ページから下記のファイルが、読み込まれその結果ページ上部に、 地域で絞り込むセレクトプルダウンが表示されます。 その結果ページのセレクトプルダウンの地域を再度選択しまして、結果が返された時に、 選択した地域名をセレクトプルダウンに表示させたいのですが、上手く動かず地域で絞るが 毎回表示されます。 <サンプル> <script type="text/javascript"><!-- function navi(value){ navi_option = document.getElementById("cityId").getElementsByTagName('option'); for(i = 0; i < navi_option.length; i++){ if(navi_option[i].value == value){ navi_option[i].selected = true; document.searchForm.cityId.options[i].selected= true; break; } } } // --></script> <select name="cityId" id="cityId" onClick="navi(value);"> <option value="0" >- 地域で絞る -</option> <option value="169">池袋東口</option> <option value="170">池袋西口</option> <option value="85" >大塚・巣鴨</option> <option value="131">赤羽</option> <option value="164">田端・王子</option> ・ ・ ・ ・ ・ </select> -略- javascriptの部分をどのように実装すれば良いでしょうか? javascriptは、初心者なので、ご教授願えれば幸いです。 宜しくお願い致します。

  • 同一データの抽出の方法について

    T1のレコードで同一の値を持つレコードを抽出したいのですがSQLが考え付きません。 ご協力願います。 ここで同一の値とはT2,T3の各サブテーブルの値の集合が一致するするものです。 下記のようなデータ例の場合、 T1のデータ1とデータ3が同一の値を持つレコードとなります。 Oracle 10を使ってます。PL・SQLでもかまいません。 T1 key データ -------------------- key1  データ1 key2  データ2 key3  データ3 T2 key value ------------------- key1 v11 key1 v12 key2 v21 key3 v11 key3 v12 T3 key value ------------------- key1 vv11 key1 vv12 key2 vv21 key2 vv22 key3 vv11 key3 vv12 よろしく御願いします。

  • データの抽出方法

    エクセルでデータの抽出を行いたいです。 シートが、「9月売上商品個数」(シート1)、「10月売上商品個数」(シート2)、「商品データベース ※20品目のみ ※JAN入力済」(シート3)の3枚あります。シート1と2の中から、シート3に入力されている20品目だけの商品をJAN(これは必ずJANとさせてください)で抽出し、シート3内の商品のみが9月と10月でどれほど売れたかのデータを作りたいです。 欲を言うと、シート3の商品の並び順と、シート1と2の商品の並び順は異なります。シート3のJANの横に「9月」と「10月」の列を作るので、そこに一括で個数が入るととても便利なのですが.... わかりづらく申し訳ありません。アドバイスいただければ幸いです。

  • データ抽出方法

    おはようございます。 sheet1 B列、C列に重複してるデータと、そうでないデータが混在して沢山あります。 sheet2 B列、C列に一点一様の型でデータを抽出したいご伝授下さい sheet1 B列、C列 A-1-1 A A-1-1 A B-2-1 D B-2-2 E C-2-1 B C-2-1 B C-2-3 C sheet2 B列、C列(抽出結果) A-1-1 A B-2-1 D B-2-2 E C-2-1 B C-2-3 C

  • データ抽出方法

    教えて下さい。 エクセルオートフィルターのような抽出がしたいです。   A B C 1  01  営業  小川 2  01  営業  大川 3 02  事務  浜田 4 02  事務  松本 5 01  営業  山本 上記の中から抽出したいのですが セルに01と入力したら隣に営業と自動で出てきて、 さらに、小川・大川・山本とフィルターのようなかんじで出てきてほしいのですが・・・。エクセルで出来るのでしょうか?教えてください。

  • データの抽出方法

    お世話になっております。 以下のような場合で、いっぺんに抽出できる良い方法があれば教えて頂きたく、よろしくお願いいたします。 会社が運営するWebサイトの会員データ (エクセルで、レコード数は1万弱)の集計。 プレゼントキャンペーンに応募して頂いた会員の個人データで、 各自、個人情報以外に4桁の抽選番号が登録してあります。 プレゼントの当選番号に該当する全ての会員データを抽出したいのですが、 一つの抽選番号に対して何名も該当者がいるため、VLOOKUPが使えず、 当選番号も数十通り程あるので、オートフィルタも時間がかかってしまいます。。。。 宜しくお願いします。

  • データの抽出方法教えてください

    No. - 枝番 地名 123- 01 札幌   125- 01 秋田 123- 02 函館 146- 01 宮崎 147- 01 那覇 以上のようなデータベースから No.が123かつ枝番が02を抽出し、"函館"を呼び出す方法を教えてください。このデータベースは次々と追加されていきます。