12448


**前提**  
・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文に組み込む(一緒にまとめて実行する)ことは出来るでしょうか？


CC BY-SA 3.0
2015-07-17T11:14:38.783
12446
2015-07-17T16:33:22.557
7886
question
mysql
セレクト結果レコードに対して、該当レコードの前後に来るidカラム値を取得したい


分析関数なら`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]

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


CC BY-SA 3.0
2015-07-17T11:47:58.160
12448
2015-07-17T11:47:58.160
5750
12446
answer


MySQLでも動かなかったらごめんなさい！自己結合だとこんな書き方になるんでしょうか。

[code]

    SELECT 
      U1.ID, 
      MAX(U1.NAME) AS NAME,
      MAX(U1.PREF_ID) AS PREF_ID,
      MAX(CASE WHEN U1.ID > U2.ID THEN U2.ID ELSE NULL END) AS PREVIOUS,
      MIN(CASE WHEN U1.ID < U2.ID THEN U2.ID ELSE NULL END) AS NEXT
    FROM 
      (SELECT * FROM USER WHERE PREF_ID = 5) U1
      INNER JOIN USER U2
      ON U2.PREF_ID = U1.PREF_ID
    GROUP BY U1.ID
    ORDER BY ID
    
[/code]

自己結合にするメリットは、このケースではなさそうに思えます。


CC BY-SA 3.0
2015-07-17T16:33:22.557
12456
2015-07-17T16:33:22.557
5337
12446
answer