0

これは私のテーブルです: 質問

id   | name
-----+-----
 2   | name 1
 3   | name 2 
 4   | name 3
 5   | name 4
 10  | name 5 
 20  | name 6
 21  | name 7

ID が 5 で、前後の行を取得する必要があるため、ID が 5 の場合は 4、5、10 を取得する必要があります

今、私はこれらのクエリを使用しています

select * from question where id = (select max(id) from question where id < 5);
select * from question where id = (select min(id) from question where id > 5);

私が探しているのは、単一のクエリです(可能な場合)。何かのようなもの

SELECT xx AS prevId, id, yy AS nextId FROM questions WHERE .......

前の ID または次の ID がない場合は、0 または -1 にする必要があります。

For example
id: 5
Return : 4, 5, 10

id:2
Return : -1, 2, 3

id: 21
Return 20, 21, -1

複数のクエリとPHPのいくつかの条件でこれを行う方法を知っていますifが、可能であれば純粋なmySQLアプローチを探しています。

4

2 に答える 2

1

ここにいくつかの例を示しますが、他の誰かがどちらがより効率的かを知ることができます。

クエリ 1

Select
  (select id from question where id<5 order by id desc limit 0,1) as prevId,
  id,
  (select id from question where id>5 order by id asc limit 0,1) as nextId
From question
Where id=5;

クエリ 2

Select
  (select max(id) from question where id<5) as prevId,
  id,
  (select min(id) from question where id>5) as nextId
From question 
Where id=5;

ああ、-1 の定義が表示されませんでした。さらにハッキングが必要です。合体関数は 1..n 個の引数を取り、最初の非 null 値を返します。

クエリ 3

Select
  Coalesce( (select max(id) from question where id<21), -1) as prevId,
  id,
  Coalesce( (select min(id) from question where id>21), -1) as nextId
From question
Where id=21;
于 2013-07-07T08:27:35.827 に答える
0

次のレコード (ID) の場合:

SELECT * FROM `table_name` WHERE ID > $id ORDER BY ID LIMIT 1;

前のレコード (ID) の場合:

SELECT * FROM `table_name` WHERE ID < $id ORDER BY ID LIMIT 1;

これは、あなた$idの欲求に応じて変化するphpの変数です

于 2013-07-07T07:58:41.540 に答える