MySQL select before after row

狂风中的少年 提交于 2019-12-18 03:34:21

问题


This is the example table:

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

I select one row that is the data to show (for example: row with callValue: val3). But I cannot find a solution for this:
I need to select previous and next row. So, in this example, I need to get data from rows vallValue: val4 and callValue: val2, or id: 5 and id: 12.

It cannot be done with id=id+-1 because id doesn't have to be continuous because of deleting rows.


回答1:


Try this:

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) 

or

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) 



回答2:


Once you have the id 8, you should be able to do a variation on:

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

and:

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

for the previous and next record.




回答3:


This works:

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)

It expands the table into 2 dimensions so you can compare the rows in the fist table to any set of rows from the second.




回答4:


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


来源:https://stackoverflow.com/questions/9836279/mysql-select-before-after-row

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!