tas_pats Posted July 15, 2009 Report Share Posted July 15, 2009 Kā ierakstam atrast nākamo un iepriekšējo ierakstu, ja atlasei ir vairāki kārtošanas parametri ? Teiksim, man ir tabula documents ar laukiem id,name,date . Dokumenti tiek atlasīti dilstoši vispirms pēc datuma, pēc tam pēc id: SELECT name FROM documents WHERE id = x ORDER BY date DESC, id DESC Kad man ir atvērts dokumenta skats man vajag saites uz nākamo un iepriekšējo dokumentu. Ja tiktu kārtots pēc viena parametra tad būtu vienkārši atrast: SELECT name FROM documents WHERE date > xxx ORDER BY date DESC LIMIT 1 Taču patlaban vainu galva nestrādā vai galīgi nevaru izdomāt kā atlasīt nākamo vai iepriekšējo, ja kārtots tiek pēc vairākiem laukiem. Quote Link to comment Share on other sites More sharing options...
xPtv45z Posted July 15, 2009 Report Share Posted July 15, 2009 Man domāt, ka kaut kā tā Iepriekšējais: SELECT name FROM documents WHERE date <=xxx AND id<x ORDER BY date DESC,id DESC LIMIT 1 Nākamais: SELECT name FROM documents WHERE date >=xxx AND id>x ORDER BY date DESC,id DESC LIMIT 1 Quote Link to comment Share on other sites More sharing options...
tas_pats Posted July 15, 2009 Author Report Share Posted July 15, 2009 Man domāt, ka kaut kā tā Iepriekšējais: SELECT name FROM documents WHERE date <=xxx AND id<x ORDER BY date DESC,id DESC LIMIT 1 tas bija pirmais, ko iedomājos, taču tādā veidā netiks atlasīti tie ieraksti kam datums ir mazāks, taču id lielāks. Quote Link to comment Share on other sites More sharing options...
Aleksejs Posted July 15, 2009 Report Share Posted July 15, 2009 Apskatīsim "iepriekšējā ieraksta" gadījumu: tātad mūs interesē vai nu nākošais mazākais id, šajā datumā, kas nepārsniedz pašreizējo: (datums = XXX AND id IN ( SELECT max(id) FROM documents AS d2 WHERE d2.datums = d1.datums AND d2.id < YY ) ) vai arī maksimāli pieejamais id lielākajam datumam, kas nepārsniedz pašreizējo: ( id IN ( SELECT MAX(id) FROM documents AS d4 WHERE datums IN (SELECT MAX(datums) FROM documents WHERE datums < XXX) ) ) Un tātad to visu apvienojot mēs iegūstam šādu SQL: SELECT name FROM documents WHERE (datums = XXX AND id IN ( SELECT max(id) FROM documents AS d2 WHERE d2.datums = d1.datums AND d2.id < YY ) ) OR ( id IN ( SELECT MAX(id) FROM documents AS d4 WHERE datums IN (SELECT MAX(datums) FROM documents WHERE datums < XXX) ) ) ORDER BY datums DESC, id DESC LIMIT 1 Protams, šāds SQLs nebūtu vajadzīgs, jakopā ar pašreizējo lapu būtu padevis līdzi arī marķieri, kas satur ciparu, kurš ieraksts pēc kārtas šajā rezultātā ir tas, kas tiek rādīts, jo tad varētu iztikt ar vienkāršu: LIMIT x+1,1 vai LIMIT x-1,1 (kur x ir pašreizējā ieraksta kārtas numurs rezultātā). Edit: Nedaudz padomāju un šķiet to pašu dara daudz vienkāršākais: SELECT name FROM documents WHERE (datums = XXX AND id < YYY) OR datums < XXX ORDER BY datums DESC, id DESC Quote Link to comment Share on other sites More sharing options...
tas_pats Posted July 16, 2009 Author Report Share Posted July 16, 2009 (edited) Ei, liels paldies Tev Aleksej - works like a charm! Edited July 16, 2009 by tas_pats Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.