[三流君] −−> [ASPで遊ぶ、失敗する] −−> [バックナンバー一覧]
−−> No.028 SQL ORDER BYでデータの並べ替え

SQL ORDER BYでデータの並べ替え


本文(発行内容)


<SQL ORDER BYでデータの並べ替え>

こんにちは、Ken3です。

データベースにアクセスできたら、
次はデータの並べ替えでしょ。
今回はデータの並べ替え(ソート)を
SQLのORDER BYを使ってやってみます。
^^^^^^^^^^^^^^
といっても、たいしたことないのでご安心を。

/*
 * 1.やりたいこと、データを並べ直したい
*/

データベース名:db026.mdb
テーブル名:TEST
フィールド
ID        オートナンバー型
F_TITLE   テキスト型
F_MEMO    テキスト型
WriteTime 日付型

の中身を条件指定無しで表示は、
http://www.ken3.org/cgi-bin/test/test026-1.asp
で、味気ないけど出来ました。

用途に応じて、データの並び順を変えて出力したいよね。
そんなことをやりたいので、
SELECT 文の ORDER BY を使ってみます。

/*
 * 2.ORDER BY ?
*/
ORDER BY ?って何?

SQLのSELECT文で指定すると、出力結果を並べ替えてくれます。

Select * From TEST ORDER BY F_TITLE
みたいに、並べ替えを行うフィールドを指定します。

なんだぁ、意外と簡単なんだね。

タイトルで並べ替えを行ったサンプル、
http://www.ken3.org/cgi-bin/test/test028-1.asp

<%@LANGUAGE=VBScript%>
<html>
<head>
<title>ORDER BYで並べ替える</title>
</head>
<body>
<h2>ORDER BYで並べ替える</h2>
test028-1.asp<br>
<hr>
<%
  'ADO DB Connection オブジェクトを作成する、英文そのままじゃん
  Set db=Server.CreateObject("ADODB.Connection")

  '.Provider?プロバイダー?通信会社?じゃなくって
  'データアクセスにはJet.OLEDB.4.0を使うことを設定
  db.Provider = "Microsoft.Jet.OLEDB.4.0"

  '次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す
  db.ConnectionString = Server.MapPath("db026.mdb")

  'やっとデータベースを開ける
  db.open

  'お約束のレコードセットの作成 テーブル名TESTから全項目(*)を指定
  'ORDER BY F_TITLEを追加しただけです。
  Set rs = db.Execute("Select * From TEST ORDER BY F_TITLE")

  'データの表示をテーブルで行う
  Response.Write "<TABLE Border='1'>"

  '見出しをバカっぽく、そのまま書き込む
  Response.Write "<TR>"
  Response.Write "<TD>ID</TD>"
  Response.Write "<TD>F_TITLE</TD>"
  Response.Write "<TD>F_MEMO</TD>"
  Response.Write "<TD>WrietTime</TD>"
  Response.Write "</TR>"

  'お約束のEOFまでループは(データが無くなるまでループ)、
  Do While rs.EOF = False   'レコードセットの.EOFがFalseの間
    Response.Write "<TR>"   '内容を表示する
    Response.Write "<TD>" & rs.Fields.Item("ID") & "</TD>"
    Response.Write "<TD>" & rs.Fields.Item("F_TITLE") & "</TD>"
    Response.Write "<TD>" & rs.Fields.Item("F_MEMO") & "</TD>"
    Response.Write "<TD>" & rs.Fields.Item("WriteTime") & "</TD>"
    Response.Write "</TR>"
    '次のレコードにポインタを移動する
    rs.MoveNext    'これを忘れると悲惨なことに、、、
  Loop

  Response.Write "</TABLE>"  'テーブルは終わりです

  '開いていたレコードセットを閉じる
  rs.Close

  'データベースも閉じようよ
  db.Close

  'お行儀よくオブジェクトも開放しましょう(通常は自動的に解放されるけど)
  Set db = Nothing

%>
<hr>
終了です。<br>

</body>
</html>

ポイントは、
^^^^^^^^^^
  'お約束のレコードセットの作成 テーブル名TESTから全項目(*)を指定
  'ORDER BY F_TITLEを追加しただけです。
  Set rs = db.Execute("Select * From TEST ORDER BY F_TITLE")
変更点は、ORDER BY F_TITLEと項目名を追加しただけです。

ねっ、簡単でしょ。

/*
 * 3.あんなに苦労した逆順並べ替えも、DESCキーワード1つで、、、
*/

私がテキストファイルの処理で、逆にデータを読めない、、
と苦労した処理も、
( 詳細は、http://www.ken3.org/backno/backno_asp05.html#23 
  の、[No.23 苦肉の策、配列をリングみたく使ってみた]を参照 )

ORDER BY 句には、DESCキーワードってあって、これを指定するだけで、
データを降順でオーダーしてくれます。
Select * From TEST ORDER BY F_TITLE DESC
こんなんでOKです。

紙面のムダだけど、ソースを載せると、
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>ORDER BYで並べ替え DESCで降順です</title>
</head>
<body>
<h2>ORDER BYで並べ替え DESCで降順です</h2>
test028-2.asp<br>
<hr>
<%
  'ADO DB Connection オブジェクトを作成する、英文そのままじゃん
  Set db=Server.CreateObject("ADODB.Connection")

  '.Provider?プロバイダー?通信会社?じゃなくって
  'データアクセスにはJet.OLEDB.4.0を使うことを設定
  db.Provider = "Microsoft.Jet.OLEDB.4.0"

  '次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す
  db.ConnectionString = Server.MapPath("db026.mdb")

  'やっとデータベースを開ける
  db.open

  'お約束のレコードセットの作成 テーブル名TESTから全項目(*)を指定
  'ORDER BY ID DESCを追加しただけです。
  Set rs = db.Execute("Select * From TEST ORDER BY ID DESC")

  'データの表示をテーブルで行う
  Response.Write "<TABLE Border='1'>"

  '見出しをバカっぽく、そのまま書き込む
  Response.Write "<TR>"
  Response.Write "<TD>ID</TD>"
  Response.Write "<TD>F_TITLE</TD>"
  Response.Write "<TD>F_MEMO</TD>"
  Response.Write "<TD>WrietTime</TD>"
  Response.Write "</TR>"

  'お約束のEOFまでループは(データが無くなるまでループ)、
  Do While rs.EOF = False   'レコードセットの.EOFがFalseの間
    Response.Write "<TR>"   '内容を表示する
    Response.Write "<TD>" & rs.Fields.Item("ID") & "</TD>"
    Response.Write "<TD>" & rs.Fields.Item("F_TITLE") & "</TD>"
    Response.Write "<TD>" & rs.Fields.Item("F_MEMO") & "</TD>"
    Response.Write "<TD>" & rs.Fields.Item("WriteTime") & "</TD>"
    Response.Write "</TR>"
    '次のレコードにポインタを移動する
    rs.MoveNext    'これを忘れると悲惨なことに、、、
  Loop

  Response.Write "</TABLE>"  'テーブルは終わりです

  '開いていたレコードセットを閉じる
  rs.Close

  'データベースも閉じようよ
  db.Close

  'お行儀よくオブジェクトも開放しましょう(通常は自動的に解放されるけど)
  Set db = Nothing

%>
<hr>
終了です。<br>
<A href="test026-1.asp">test026-1.asp db026.mdb内のデータを確認する</a><br>
<A href="test027-2.asp">test027-2.asp データを追加する</a><br>
<A href="test028-1.asp">test028-1.asp TITLEで並べ替え</a><br>

</body>
</html>

ポイントは、
^^^^^^^^^^^
  'お約束のレコードセットの作成 テーブル名TESTから全項目(*)を指定
  'ORDER BY ID DESCを追加しただけです。
  Set rs = db.Execute("Select * From TEST ORDER BY ID DESC")
と、ID DESCを追加して、
IDの降順(逆順)でレコードセットが返ってきます。

あんなに苦労したのに、こんなんでいいの?
って感じるくらい簡単ですよね。

SQL文、面白そうですか?
それとも、
なんか自分には合わない?

まぁ、相性あるけど、慣れれればなんとかなりますよ。

テストは、
http://www.ken3.org/cgi-bin/test/test028-2.asp
で、降順で表示されます。

/*
 * 4.終わりの挨拶
*/

今回は、
・ORDER BYで並べ替え(ソート)
・ORDER BY フィールド DESCで降順の並べ変え(大きい順)
データを並べ替えてみました。

覚えてしまえば、
テキストファイルに書いてた時より楽ですね。

素朴な疑問あったら、気軽に、
メール、掲示板に書き込んでくださいね。

ASP、VBScript勉強中の三流プログラマーのKen3でした。

フィードバック

ASP系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.028を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります

三流君の主なリンク先

[アクセスランキング] [サイトマップ] [リンク先・相互リンク先など]
ASPで遊ぶ、失敗する 掲示板 バックナンバー 登録と解除
三流プログラマー 業務の愚痴 掲示板 バックナンバー 登録と解除
VBAで楽しくプログラミング 掲示板 バックナンバー 登録と解除
コンビニのオモテとウラ話 掲示板 バックナンバー 登録と解除
www.ken3.org(サイト内)から Google を利用して、

Ken3の日記(weblog) -- [広告・副収入系] [プログラマー業務の愚痴] [VBA系の話題] [ASP系の話題] [コンビニ系ネタ] [その他]

その他 宣伝広告