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). Но не мога да намеря решение за това:
Трябва да избера предишен и следващ ред. И така, в този пример трябва да получа данни от редове callValue: val4 и callValue: val2 или id: 5 и id: 12.

Не може да се направи с id=id+-1, защото id не трябва да бъде непрекъснато поради изтриване на редове.


person bosniamaj    schedule 23.03.2012    source източник


Отговори (3)


След като имате 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

за предишния и следващия запис.

person paxdiablo    schedule 23.03.2012
comment
това решение е по-кратко и по-добре разбираемо за всички. - person Albi Patozi; 23.12.2012
comment
откъде знаеш, че е по-добре за всички? вероятно искаш да кажеш, че е било по-добре за теб самия. - person Jure Špik; 31.03.2015
comment
Той е по-кратък, използва по-прост синтаксис, по-четлив е и има превъзходна производителност. Мисля, че е безопасно да се каже, че е по-добре като цяло. - person Luciasar; 10.08.2015
comment
@JureŠpik, хайде, ясно е, че е по-добър от приетия отговор. - person Wesley Brian Lachenal; 04.01.2017
comment
Да, но не беше по-добре за всички, тъй като за мен другият отговор беше по-добър. - person Spikolynn; 31.01.2017

Опитайте тази:

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) 
person Andrey Gurinov    schedule 23.03.2012
comment
Първо получих съобщение за грешка, но поставянето на () след union го реши :) - person bosniamaj; 23.03.2012
comment
Добре дошли! Не съм много добър със специфичния за mysql синтаксис, съжалявам :( - person Andrey Gurinov; 23.03.2012

Това работи:

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 измерения, така че можете да сравните редовете в първата таблица с всеки набор от редове от втората.

person McGarnagle    schedule 23.03.2012