Hoe kan je het vorig, huidig en volgend record ophalen met behulp van MySQL?

Standaard

Het idee dat dit mogelijk moest zijn met behulp van MySQL hield me al een hele tijd bezig en eureka we zijn er. Hoe hebben we dit opgelost?

1. Ga ervan uit dat je de filter hebt voor het huidige record

Bijvoorbeeld

q.id = 40534

2. Neem de query waarmee de gegevens worden opgehaald

Bijvoorbeeld

select q.*
from queue q
where q.id in (40531,40532,40533,40534,40535,40536,40537,40538,40539,40540)

3. Voeg daar de volgende regels aan toe aan de select- en de from-clausule

Waarbij we de rownum per record bepalen en in een paar If statements controleren op onze filter (zie punt 1) en op basis hiervan de volgende rownum en vorige rownum bepalen.

@rownum:=@rownum+1,
if(q.id = 40534,@rownum,0) as activerow,
if(q.id = 40534,@rownext := @rownum + 1,0) as nextrow,
if(q.id = 40534,@rowprev := @rownum – 1,0) as prevrow,

En de variabelen intialiseren in de from

(SELECT @rownum:=0) r, (SELECT @rownext:=0) n, (SELECT @rowprev:=0) p

4.  Maak van deze query een subquery

select x.activerow, x.nextrow, x.prevrow from (

/* de query die in stap 1, 2 & 3 is samengesteld */

) x

5. Gebruik de query uit stap 2 opnieuw en voeg volgende regels toe aan de select- en de from-clausule

Dit aan de select

(@hrownum:=@hrownum+1) as hqrow, 

en deze aan de from

(SELECT @hrownum:=0) hr

6. Gebruik deze query uit stap 5 en controleer met behulp van een exists of de hqrow van de query overeenkomt met de vorige, huidige & volgende rownum van de query uit stappen 1-4

Uiteindelijk krijg je dan het volgende resultaat als voorbeeld:

select y.* from
(
select
(@hrownum:=@hrownum+1) as hqrow,
qh.*
from queue qh, (SELECT @hrownum:=0) hr
where qh.id in (40531,40532,40533,40534,40535,40536,40537,40538,40539,40540)
) y
where exists
(
select x.activerow, x.nextrow, x.prevrow from (
select
@rownum:=@rownum+1,
if(q.id = 40534,@rownum,0) as activerow,
if(q.id = 40534,@rownext := @rownum + 1,0) as nextrow,
if(q.id = 40534,@rowprev := @rownum – 1,0) as prevrow,
q.*
from queue q, (SELECT @rownum:=0) r, (SELECT @rownext:=0) n, (SELECT @rowprev:=0) p
where q.id in (40531,40532,40533,40534,40535,40536,40537,40538,40539,40540)
) x
where x.id = 40534
and (
x.activerow = y.hqrow or
x.nextrow = y.hqrow or
x.prevrow = y.hqrow
)
)

Veel query genot!

Advertenties

Geef een reactie

Vul je gegevens in of klik op een icoon om in te loggen.

WordPress.com logo

Je reageert onder je WordPress.com account. Log uit / Bijwerken )

Twitter-afbeelding

Je reageert onder je Twitter account. Log uit / Bijwerken )

Facebook foto

Je reageert onder je Facebook account. Log uit / Bijwerken )

Google+ photo

Je reageert onder je Google+ account. Log uit / Bijwerken )

Verbinden met %s