2017-06-05 2 views
1

Ich habe eine Tabelle foo mit seinem Primärschlüssel id und einige andere Spalten. Mein Ziel ist es zum Beispiel Zeilen mit id=3 und id=4 und Zeilen mit id=6 und id=7 für Zeile mit id=5 zu finden - falls ich 2 nächste nächste und nächste Zeile suchen möchte.Wie erhält man die nächsten n Zeilen für eine bestimmte Zeile in der Tabelle?

In dem Fall, dass es nur eine oder keine solche Zeilen gibt (z. B. für id=2 gibt es nur vorherige Zeile) Ich möchte nur mögliche solche erhalten.

Das Problem ist, dass einige Zeilen fehlen können.

Gibt es eine allgemeine Praxis, solche Abfragen zu machen?

+0

Also, wenn nur eine vorherige Zeile verfügbar, können Sie nur eine nächste Zeile dann brauchen? (auch wenn Sie am Anfang 5 vorherige und 5 nächste Reihen wollten)? –

+0

@OtoShavadze nein. In diesem Fall brauche ich eine vorherige Zeile und 5 nächste. – ivkremer

Antwort

2

Ich würde versuchen, die folgenden:

SELECT * FROM table WHERE id > ? ORDER BY id ASC LIMIT 2 

gefolgt von

SELECT * FROM table WHERE id <= ? ORDER BY id DESC LIMIT 2 

Sie können möglicherweise die oben in den folgenden kombinieren:

SELECT * FROM table WHERE id > ? ORDER BY id ASC LIMIT 2 
UNION 
SELECT * FROM table WHERE id <= ? ORDER BY id DESC LIMIT 2 
0

Dies ist eine mögliche Lösung, indem Sie alle Datensätze nummerieren und diejenigen abrufen, bei denen die Zeilennummer 2 Zeilen größer oder niedriger als die ausgewählte ID ist.

create table foo(id int); 
insert into foo values (1),(2),(4),(6),(7),(8),(11),(12); 
-- using ID = 6 

with rnum as 
(
    select id, row_number() over (order by id) rn 
    from foo 
) 
select * 
from rnum 
where rn >= (select rn from rnum where id = 6) - 2 
and rn <= (select rn from rnum where id = 6) + 2; 
 
id | rn 
-: | -: 
2 | 2 
4 | 3 
6 | 4 
7 | 5 
8 | 6 
-- using ID = 2 

with rnum as 
(
    select id, row_number() over (order by id) rn 
    from foo 
) 
select * 
from rnum 
where rn >= (select rn from rnum where id = 2) - 2 
and rn <= (select rn from rnum where id = 2) + 2; 
 
id | rn 
-: | -: 
1 | 1 
2 | 2 
4 | 3 
6 | 4 

dbfiddle here

0

Ich denke, dies ist Ihre Beschreibung passen würde.

Select * from table where id between @n-2 and @n+2 and id <> @n 
0

Ein Weg, ist das:

with your_table(id) as(
    select 1 union all 
    select 2 union all 
    select 4 union all 
    select 5 union all 
    select 10 union all 
    select 11 union all 
    select 12 union all 
    select 13 union all 
    select 14 
) 

select * from (
    (select * from your_table where id <= 10 order by id desc limit 3+1) 
    union all 
    (select * from your_table where id > 10 order by id limit 3) 
) t 
order by id 

(Hier ist 10 Punkt beginnen und 3 ist n Zeilen, die Sie wünschen)

Verwandte Themen