Įsivaizduokime įprastą situaciją. Ya kažkoks sąrašas pateiktas svetainėje. Jei jis bus nedidelis, jį galima paprastai atvaizduoti. Jei sąrašas gali ilgėti vadinasi prireiks puslapiavimo kurį galima lengvai padaryti.
Tarkim seniau buvo tarkim prekių kainų sąrašas nepuslapiuotas. Jis patogus buvo dėlto, kad iš prekės aprašymo galima lengvai nušokti į to sąrašo tam tikrą vietą. Galima ir pasinaudoti anhoru:
<a href=”su:su:/linkas.php#preke12″>šok čia</a>
Galima ne tik nušokti, bet ir pažymėti :)
<a href=”su:su:/linkas.php?zymek=12#preke12″>šok čia</a>
Viskas gražu ir t.t. Didėjant kiekiui neaoptimalu viską pateikti vienoje vietoje, tikrai naudinga ir puslapiuoti. Va ir iškilo klausimas: Turiu sąlygas kaip atrenkamas sąrašas, žinau rikiavimo sąlygas, o kaip sužinoti kur bus pagal tuos parametrus įrašas kurio id=12. Jis gali būti ir pradžioje ir gale. Taigi va ir kankinausi ieškodamas sprendimo. Taigi sužinojus vietą (eiliškumą) galima lengvai surasti ir puslapį kuriame bus. O kaip tai praktiškai įgyvendinti?
Vienas variantas. Tempiam į PHP visą lentelę, ir ieškom (sukam ciklą) kur tas įrašas bus. Žinoma surasim, gal ir patogu, bet!. Dideliam kiekiui duomenų reiks viską tempti, tai vadinasi ilgiau užtruks, be to duomenys parsiųsti bus talpinami į RAM, taigi didėjant duomenų kiekiui bei lankytojų kiekiui gali atsirasti situacija “Ramo trūksta”. Tad vadinasi sprendimas blogas.
Gal yra galimybė tai atlikti kažkaip kitaip? Logiškiausia paduoti gudrią užklausą ir taip sužinojus vietą, jau tempti tik duos duomenis kurie reikalingi. Paeksperimentavęs radau vieną iš galimų sprendimų:
set @a:=0;<br />select @a as nr, r.id from LENTELE as r<br />where @a:=IF((r.id=19),(@a+1),(@a+1)) having r.id=19 order by id
Kodėl tokia įdomi sąlyga @a:=IF((r.id=19),(@a+1),(@a+1)) nežinau net pats, realiai reikia @a+1 tiktai, o be IF neveikia :(
Ką gi gavu numeriuką reikiamą, viskas gražu, na beveik gražu. Truputį lėtoks sprendimas, net nežinau ar jis tinkamas ant didelių lentelių. va norėtusi kažkokio optimalesnio varianto.
Gal kokių idėjų pasiūlytumėte?
2005-05-16 papildymas:
Šiektie pasikapstęs ir pan gavau ir tokį sprendimą
set @i=0;
CREATE TEMPORARY TABLE `findrownumber` Select (@i:=@i+1) as rownumber, `id`, `title` FROM table where `active`=1 order by `title` asc;
SELECT * FROM `findrownumber` WHERE `id` = 23
Ant kiek jis geras spręskite patys :)