从当前id SQL PHP获取两个上一行和下一行数据

时间:2017-11-26 13:22:17

标签: php mysql sql

我有一个包含数据库的表,我希望在当前id之前获取两个数据,并在当前id之后获取两个数据。

primary_key     id
1               345
2               356
3               400
4               102
5               210
6               190

案例:

  • 如果当前ID定义为 400 ,则之前的结果为 356& 345 和 之后 102& 210
  • 如果当前ID定义为 210 ,则之前的结果为 102& 400 和 之后 190
  • 如果当前ID定义为 356 ,则之前的结果为 345 , 之后 400& 102
  • 如果当前ID定义为 345 ,则之前的结果为 NULL , 之后 356& 400
  • 如果当前ID定义为 190 ,则之前的结果为 210& 102 和 之后是 NULL

我尝试这个SQL但不能正常工作,

$define_id = 400;

SELECT *
FROM table_name

WHERE ( 
    id = IFNULL(
        (
            SELECT MIN(id)
            FROM table_name
            WHERE id > $define_id
        ), 0 )

    OR id = IFNULL(
        (
            SELECT MAX(id)
            FROM table_name
            WHERE id < $define_id
        ), 0 )
) 

LIMIT 2

在数据之前和之后获取的代码成功,但只有一个在之前和之后。我希望在之前和之后获得两个结果。

请帮忙。

2 个答案:

答案 0 :(得分:1)

尝试使用您在问题中提到的输出。如果这不是你想要的,请更清楚地解释。

    CREATE TABLE IF NOT EXISTS `docs` (
  `primary_key` int(6) unsigned NOT NULL,
  `id` int(3) unsigned NOT NULL,
  PRIMARY KEY (`primary_key`,`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `docs` (`primary_key`, `id`) VALUES
  ('1', '345'),
  ('2', '356'),
  ('3', '400'),
  ('4', '102'),
  ('5', '210'),
  ('6', '190');

查询

(SELECT * FROM docs WHERE primary_key < (SELECT primary_key FROM docs WHERE id = 400) ORDER BY primary_key DESC LIMIT 2)
UNION ALL
(SELECT * FROM docs WHERE primary_key > (SELECT primary_key FROM docs WHERE id = 400) ORDER BY primary_key ASC LIMIT 2);

Sqlfiddle link http://sqlfiddle.com/#!9/e11c8d/2

答案 1 :(得分:0)

一种方法对两组使用union all

(select 'before' as which, t.*
 from t cross join
      (select primary_key from t where id = $define_id) x
 where t.primary_key < x.primary_key
 order by t.primary_key desc
 limit 2
) union all
(select 'after' as which, t.*
 from t cross join
      (select primary_key from t where id = $define_id) x
 where t.primary_key > x.primary_key
 order by t.primary_key asc
 limit 2
);