2012-03-23 16 views
9

Questa è la tabella di esempio:MySQL selezionare prima fila dopo

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 

seleziono una riga che sono i dati per mostrare (ad esempio: riga con callValue: val3). Ma non riesco a trovare una soluzione per questo:
Ho bisogno di selezionare la riga precedente e successiva. Quindi, in questo esempio, ho bisogno di ottenere i dati da file vallValue: val4 e callValue: val2, o id: 5 e id: 12.

Non può essere fatto con id = id + -1 perché id non lo fa deve essere continuo a causa dell'eliminazione di righe.

risposta

20

Prova questo:

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) 

o

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

Grazie uomo, sei veloce :) – bosniamaj

+0

Prima ho ricevuto il messaggio di errore, ma mettere() dopo l'unione risolto :) – bosniamaj

+0

Benvenuto! Non sono molto bravo con la sintassi specifica di mysql, mi spiace :( –

11

Una volta che avete l'id 8, si dovrebbe essere in grado di fare una variante:

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

e:

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

per il record precedente e successivo.

+4

questa soluzione è più breve e migliore da capire per tutti. –

+2

come fai a sapere che è meglio per tutti? Probabilmente vuoi dire che era meglio per te stesso –

+2

È più breve utilizza una sintassi più semplice, è più leggibile e ha prestazioni superiori. Penso che sia sicuro dire che è complessivamente migliore – Luciasar

2

Questo funziona:

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) 

si espande la tabella in 2 dimensioni in modo da poter confrontare le righe della tabella pugno per qualsiasi insieme di righe della seconda.

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