- ベストアンサー
sql文の書き方のついて
初心者です。よろしくお願致します。 特定の文字列の数を数え多い順に並び替える事は可能でしょうか? 具体的な例: フィールド名(xxx)に Aが10個 Bが50個 Cが70個 Dが90個 フィールド名(yyy)に Aに1 Bに2 Cに3 Dに4 フィールド名(xxx)に入っている文字列を数え 上記の場合だと (yyy)の並び順は1 2 3 4 としたいのですが、一向にわかりません。 可能であれば、是非ご教授お願いします。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
質問内容が具体的でない&矛盾しているため、回答者の受け取り方も違ってきて、いろいろな回答が出てきて混乱していますね。 やりたいことを整理して、具体的に示してください。 ■LENかLENGTHか? LENやLENGTHは、文字の長さを返す関数です。 MySQLの場合は、LENGTHです。 ただし、あなたの質問の補足説明のデータを見ると、 やりたいことは、「文字の長さ」を求めるのではなく、「同じ文字列の入った行数を求める」ことであり、 LENGTH関数ではなく、COUNT関数を使うことになります。 ■同じ文字列を持つ行数を、文字列の種類ごとに得る この場合、group byとcount関数を使うことで得られます。 select `xxx`,count(*) from `table1` group by `xxx` order by 2; 上記SQLで、文字列の種類ごとに、行数が少ない順に結果を得られます。 ■質問の矛盾 ANo.4への回答で、以下の矛盾があります。 文字列='a'を持つidは、1~4。 文字列='b'を持つidは、5~7。 文字列='c'を持つidは、8。 質問にある「(yyy)の並び順は1 2 3 4」のyyyは、idのことだと思います。 文字列の種類ごとにidは複数の値があるので、文字列ごとの件数と、idは対応付けられません。
その他の回答 (7)
s_husky です。 あらためて、お詫びしておきます。 「決して、MYSQLという検証不可の質問には答えない」というルールを守っているつもりでしたが、「カテ」を見落としてました。 結果的に、正しい回答を遠のかせてしまいました。 大いに、反省しております。
お礼
s_huskyさん ご丁寧にご指導ありがとうございました。 私の説明不足の為にご迷惑をおかけしました。 しかし、ながら初めてみる文だったので勉強にもなりました。 ありがとうございました。
- moon_night
- ベストアンサー率32% (598/1831)
select id,count(id) from table1 group by id order by id; >単純にxxxの中身の文字列数順に表示したいと思っています。 ここが分かりませんが・・・ ABCDと並べるのでしたら上の構文で問題ないと思います。(多分) 多い順とかに並べる場合は別の手が必要。 できれば想定している結果もあれば正確に答えられると思います。
s_husky です。 http://www.mysql.gr.jp/ 参考になります。 Len(Text) ではエラーになるようです。 ※急いでいるならば、Len(xxx)はMySQLならばLength(xxx)でしょうか?という再質問を立てられたらと思います。 ※私は、確認出来る環境にないので撤退します。
s_husky です。 1=Access2003。 2=Sql Server 2000。 で検証しています。
お礼
s_huskyさん 度々ありがとうございます。 PHP バージョン: 4.3.10 mysqlのバージョンは不明 SAKURAレンタルサーバー(プレミアム)を利用しています。 このようなテーブルを作成して再度挑戦してみましたがやはりエラーとなってしまいました。 私の環境では実現は難しいのでしょうか。 CREATE TABLE `table1` ( `id` int(11) NOT NULL auto_increment, `xxx` varchar(10) NOT NULL default '', PRIMARY KEY (`id`) ) TYPE=MyISAM AUTO_INCREMENT=9 ; INSERT INTO `table1` VALUES (1, 'a'); INSERT INTO `table1` VALUES (2, 'a'); INSERT INTO `table1` VALUES (3, 'a'); INSERT INTO `table1` VALUES (4, 'a'); INSERT INTO `table1` VALUES (5, 'b'); INSERT INTO `table1` VALUES (6, 'b'); INSERT INTO `table1` VALUES (7, 'b'); INSERT INTO `table1` VALUES (8, 'c');
- moon_night
- ベストアンサー率32% (598/1831)
テーブル構成がわからないのですが? 予想: table xxx|yyy| A |1 | B |2 | B |3 | C |4 | D |5 | A |6 | C |7 | ・xxx にはAが10個、Bが50個、、、 ・yyy には auto_incrementで設定したid こんなテーブルになってるのでしょうか? なんか違いそう。。
お礼
テーブルの構成はまさにそのような構成です。 単純にxxxの中身の文字列数順に表示したいと思っています。
ANSI準拠のSQL文ですと... SELECT ID, Len(xxx) AS Count FROM Table1 ORDER BY Len(xxx) DESC; |ID|COUNT| --|--------- 1| 3| 3| 2| 2| 2| 3| 1| 1| ID xxx 1 A 2 BB 3 ACC
お礼
ご返信ありがとうございます。 やはり同様にLen(xxx)部分でエラーがでてしまいます。 バージョン的な問題なのでしょうか・・・。
>特定の文字列の数を数え多い順に並び替える SELECT テーブル1.xxx, テーブル1.yyy, Len([xxx] & "") AS CharCount FROM テーブル1 ORDER BY Len([xxx] & "") DESC; この場合、 xxx yyy CharCount AAAAA 1 5 DDDD 4 4 CCC 3 3 BB 2 2 となりますが... >フィールド名(yyy)に >Aに1 >Bに2 との箇所が理解できていませんので、参考になるかどうか?
お礼
さっそくのご返信ありがとうございます。 >フィールド名(yyy)に >Aに1 >Bに2 の部分はauto_incrementで設定したid入っています。 文字列の多い順番にID順に並び替えると意味だったのですが、説明不足でした申し訳ございません。 上記のsql文を実行すると、なぜかLen([xxx] & "")の部分でエラーがでてしまいます。 yyyの部分は必要ないかと思い SELECT テーブル1.xxx, Len([xxx]) AS CharCount FROM テーブル1 ORDER BY Len([xxx]) DESC; として再度実行してみましたがやはり同じ場所でエラーとなってしまいます。^^;
お礼
ご返信ありがとうございます。 上記のsql文でやりたいことを実現する事ができました。 また、説明不足の為、みなさんを混乱させてしまって本当にすいませんでした。 みなさんご丁寧にご指導ありがとうございました。