セレクト結果レコードに対して、該当レコードの前後に来るidカラム値を取得したい


**前提**  
・MySQL

[code]

    SELECT * FROM `user` WHERE `pref_id` = 5;
    
[/code]

id name pref_id  
・248 佐藤 5  
・250 鈴木 5  
・317 山田 5  
・400 中村 5

※idカラムには、AUTO_INCREMENTを設定しています

* * *

**質問1**

・この時、任意のidを引数として、前後のレコードがあればidを取得したいのですが、どうすれば良いでしょうか？

例1 ／ 250を渡す  
・前のレコードidとして248、後のレコードidとして317を取得したい

例2 ／ 400を渡す  
・前のレコードidとして317を取得したい

* * *

**質問2**  
・質問1の内容を、前提のSELECT文に組み込む(一緒にまとめて実行する)ことは出来るでしょうか？




分析関数なら`LAG()`と`LEAD()`ですが、MySQLで実現するには副問い合わせでしょうか。

[code]

    SELECT id
         , name
         , pref_id
         , (SELECT MAX(id) FROM user t2 WHERE t2.id < t1.id AND t2.pref_id = 5)
         , (SELECT MIN(id) FROM user t2 WHERE t2.id > t1.id AND t2.pref_id = 5)
      FROM user t1
     WHERE pref_id = 5
     ORDER BY id
    
[/code]

ソート順がキー以外の場合はもう少し複雑になるかと思います。




分析関数なら`LAG()`と`LEAD()`ですが、MySQLで実現するには副問い合わせでしょうか。

[code]

    SELECT id
         , name
         , pref_id
         , (SELECT MAX(id) FROM user t2 WHERE t2.id < t1.id AND t2.pref_id = 5)
         , (SELECT MIN(id) FROM user t2 WHERE t2.id > t1.id AND t2.pref_id = 5)
      FROM user t1
     WHERE pref_id = 5
     ORDER BY id
    
[/code]

ソート順がキー以外の場合はもう少し複雑になるかと思います。

