Jump to content
php.lv forumi

Nākamais un iepriekšējais ieraksts


tas_pats

Recommended Posts

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...