• Like
  • Save
Data sorting by SQL
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

Data sorting by SQL

  • 451 views
Published

The presentation for nichicom Lightning Talk on 2010-05-21 …

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

Published in Technology , Business
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
451
On SlideShare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
0
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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