開発環境は以下になります。
・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文で並び替えが出来るのか、何卒ご教授ください。
宜しくお願い致します。
お礼
ありがとうございます。 何とか解決することができました。 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"; 上記のようにまずは地域の並び順だけ求めて、それを次のセレクト文で使用する ケース部分の値に代入し、最後は教えていただいたセレクト文で 思っていた通りの表示ができました。 ありがとうございました。
補足
回答ありがとうございます。 本当に私の説明が下手糞で申し訳ございません。 `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件) これが多い順の条件となりますので、これの順序どおりにすると上記の並び順になるということです。 何卒宜しくお願い致します。