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