• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:抽出データのソート方法について)

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

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

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

  • ベストアンサー
  • 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