2012-03-23 86 views
9

后,这是示例表:MySQL的选择前行

Column    | 1st record | 2nd record | 3rd record | 4th record | etc<br /> 
id (primary)  | 1   | 5   | 8   | 12   | etc<br /> 
name    | name 1  | name 2  | name 3  | name 4  | etc<br /> 
date    | date 1  | date 2  | date 3  | date 4  | etc<br /> 
callValue (unique) | val1  | val2  | val3  | val4  | etc 

我选择一列是数据显示(例如:一行callValue:VAL3)。但我找不到解决方案:
我需要选择上一行和下一行。所以,在这个例子中,我需要从行vallValue获取数据:VAL4和callValue:VAL2,或ID:5和ID:12

它不能与id = id + -1,因为id没有完成必须连续删除行。

回答

20

试试这个:

select * from test where callValue = 'val3' 
union all 
(select * from test where callValue < 'val3' order by id desc limit 1) 
union all 
(select * from test where callValue > 'val3' order by id asc limit 1) 

select * from test where id = 8 
union all 
(select * from test where id < 8 order by id desc limit 1) 
union all 
(select * from test where id > 8 order by id asc limit 1) 
+0

感谢的人,你快:) – bosniamaj 2012-03-23 09:37:02

+0

首先我收到错误消息,但把()后,工会解决它:) – bosniamaj 2012-03-23 09:38:18

+0

欢迎您!我并不擅长使用特定于mysql的语法,对不起:( – 2012-03-23 09:39:54

11

一旦你的ID 8,你应该能够做一个变化:

select * from mytable 
where id < 8 
order by id desc 
limit 1 

和:

select * from mytable 
where id > 8 
order by id asc 
limit 1 

为上一个和下一个记录。

+4

这种解决方案更简单,更好地理解每个人) – 2012-12-23 01:11:22

+2

你怎么知道这对每个人都好?你可能是说这对你自己更好。 – 2015-03-31 18:35:44

+2

它更短,它使用更简单的语法,更具可读性,并且具有更好的性能,我认为可以说总体上更好。 – Luciasar 2015-08-10 16:33:34

2

这工作:

select a.id, a.name, a.date, a.callValue 
FROM 
(
    select @r0 := @r0 + 1 as rownum, id, name, date, callValue from TABLE 
    , (SELECT @r0 := 0) r0 
) a, 
(
    select @r1 := @r1 + 1 rownum, id, name, date, callValue from TABLE 
    , (SELECT @r1 := 0) r1 
) b 
where b.callValue = val3 and b.rownum between (a.rownum-1 and a.rownum+1) 

它展开的表格到2个维度,因此您可以在拳头表中的行比较的任何一组从第二排。

-1
select * 
from callvalue 
where id < maxd 
(
select max(id) as maxd 
from callvalue 
where id = maxd 
)