• ベストアンサー

group by とorder by

失礼致します。 質問させてください。 今テーブルに下のように値が入っています。 No 名前 1 そのこ 2 さちえ 3 あやこ 4 ともよ 5 ひろみ 6 うめこ このテーブルにおいて 名前があ行、か行、さ行の人をNoの昇順で表示し、続けて名前がそれ以外の人のレコードをNoの降順で表示したいです。結果を次のようにしたいです。 2 さちえ 3 あやこ 6 うめこ 5 ひろみ 4 ともよ 1 ののこ sqlを2回発行するのは避けたいです。 ヒントだけでもいいので教えてください。 よろしくお願いします。m(__)m

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

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

希望の検索結果を得られるSQL例を示します。 このSQLでは、、、 (1)あ行、か行、さ行で始まる名前の場合は、10000-No(つまりNoが小さいほど、大きな数字になる)をソートで使用 (2)あ行、か行、さ行以外で始まる名前の場合は、Noをソートで使用 という方法を取り、ソートは降順にしています。 これにより、(1)のケースはNoの昇順、(2)のケースはNoの降順が簡単なSQLで実現できます。 【SQL例】 select No,名前 from t1 order by case when substr(名前,1) between 'あ' and 'そ' then 10000-No else No end desc ;

javatea_1985
質問者

お礼

難か難しそうですが、おっしゃっていることは分かります。 関連する10000-Noのところを勉強してみます。 ありがとうございました。m(__)m また、質問の件なのですが、 SQL = (select No, Name from t1 where Name = *** order by No ASC) union (select No,Name from t1 where Name = *****) という形で解決しました。 ()でくくるのが例題からはなかなか見抜けず手間取りました。

その他の回答 (2)

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

あとはテンポラリに流し込むとかもありますね。 CREATE TEMPORARY TABLE `TEMP` SELECT `No`,`名前` FROM `テーブル` WHERE SUBSTRING(`名前`,1,1) BETWEEN 'あ' AND 'そ' ORDER BY `名前` ASC; INSERT INTO `TEMP` SELECT `No`,`名前` FROM `テーブル` WHERE NOT(SUBSTRING(`名前`,1,1) BETWEEN 'あ' AND 'そ') ORDER BY `名前` DESC; SELECT * FROM `TEMP`;

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

これはやっぱりSELECT文とSELECT文をUNIONでつなぐしかないでしょう。

javatea_1985
質問者

補足

やっぱりないですかあ~(泣 そのunionというのを勉強してみます。 unionでつなぐのと、 出てきたデータをひとつのベクターにまとめるのと どちらがいいでしょうか?? 特にひとつのテーブルで表示させたいというところに こだわった場合どうなりますか? よろしくお願いします。m(__)m