Data sorting by SQL

575 views

Published on

The presentation for nichicom Lightning Talk on 2010-05-21
Author SOHGA Co. Ltd. TANAKA Tozo

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
575
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Data sorting by SQL

  1. 1. ここに「ORDER BY 姓、名、ID」の順で表示されるテーブルTがあります。 ID 姓 名 2 あああ うみこ 1 ああい いちろう 3 ああう あきら ここで、ID=1「ああい いちろう」の情報を表示する画面を考えます。 項目名 値 ID 1 姓 ああい 名 いちろう ← 一つ前(あああ うみこ)へ      一つ後(ああう あきら)へ-> このとき、上図の一つ前と一つ後のリンクに使われている 「一つ前のレコードの姓名」と「一つ後ろのレコードの姓名」を 一回で取得するSQL文を考えてください。 なお、以下に注意してください。  ・DBMSはMySQL(OracleでいうROW_NUMBER等は非対応)とします。  ・テーブルTにはID,姓,名以外のフィールドはありません。  ・同姓同名もありうるものとします。  ・IDはソート順を指すものではありません。  ・サブクエリは使用できます。
  2. 2. まずは現在位置を特定 あああ うみこ ID:2 ああう あきら ID:3 ああい いちろう ID:1
  3. 3. SELECT CONCAT(` 姓 `,` 名 `) FROM `test` WHERE ID='1' あああ うみこ ID:2 ああう あきら ID:3 ああい いちろう ID:1
  4. 4. 姓名順ではなくID順なら SELECT CONCAT(` 姓 `,` 名 `) FROM `test` WHERE ID='1' あああ うみこ ID:2 ああう あきら ID:3 ああい いちろう ID:1
  5. 5. SELECT CONCAT(`姓`,`名`) FROM `test` WHERE ID='1' SELECT CONCAT(`姓`,`名`) FROM `test` WHERE ID > '1' ORDER BY `ID` LIMIT 1 ああい いちろう ID:1 あああ うみこ ID:2 ああう あきら ID:3
  6. 6. Oracleなら SELECT CONCAT(` 姓 `,` 名 `) FROM `test` WHERE ID='1' あああ うみこ ID:2 ああう あきら ID:3 ああい いちろう ID:1
  7. 7. SELECT CONCAT(` 姓 `,` 名 `) FROM `test` WHERE ID='1' SELECT CONCAT( LAG(` 姓 `) OVER( ORDER BY ` 姓 `,` 名 `,`ID`), LAG(` 名 `) OVER( ORDER BY ` 姓 `,` 名 `,`ID`) ) FROM `test` WHERE ID = '1' あああ うみこ ID:2 ああう あきら ID:3 ああい いちろう ID:1
  8. 8. MySQLでがんばる SELECT CONCAT(` 姓 `,` 名 `) FROM `test` WHERE ID='1' あああ うみこ ID:2 ああう あきら ID:3 ああい いちろう ID:1
  9. 9. SELECT CONCAT(` 姓 `,` 名 `) FROM `test` WHERE ID='1' SELECT (SELECT CONCAT(` 姓 `,` 名 `) FROM `test` WHERE (` 姓 ` < `T`.` 姓 `) -- より若い姓 OR(` 姓 ` = `T`.` 姓 ` AND ` 名 ` < `T`.` 名 `) -- より若い名 OR(` 姓 ` = `T`.` 姓 ` AND ` 名 ` = `T`.` 名 ` AND `ID` < `T`.`ID`) -- より若い ID ORDER BY ` 姓 ` DESC, ` 名 ` DESC, `ID` DESC LIMIT 1 -- 姓名 ID の降順で最初に採用されるレコード ) AS ` 一つ前のレコードの姓名 ` FROM `test` AS `T` WHERE ID = '1' ああい いちろう ID:1 あああ うみこ ID:2 ああう あきら ID:3
  10. 10. SELECT (SELECT CONCAT(` 姓 `,` 名 `) FROM `test` WHERE (` 姓 ` < `T`.` 姓 `) -- より若い姓 OR (` 姓 ` = `T`.` 姓 ` AND ` 名 ` < `T`.` 名 `) -- より若い名 OR (` 姓 ` = `T`.` 姓 ` AND ` 名 ` = `T`.` 名 ` AND `test`.`ID` < `T`.`ID`) -- より若い ID ORDER BY ` 姓 ` DESC, ` 名 ` DESC, `ID` DESC LIMIT 1 -- 姓名 ID の降順で最初に採用されるレコード ) AS ` 一つ前のレコードの姓名 ` FROM `test` AS `T` WHERE ID = '1' あああ うみこ ID:2 ああう あきら ID:3 ああい いちろう ID:1
  11. 11. あああ うみこ ID:2 ああう あきら ID:3 ああい いちろう ID:1

×