Avatar billede razmuz_dk Nybegynder
07. december 2005 - 09:41 Der er 7 kommentarer og
1 løsning

Find forrige, aktuelle og næste id

Jeg sidder og er ved at lave et lille "galleri" i PHP/MySQL til mine private fotos.

Alle billeder ligger i en tabel hvor image_id er primary key.

Det jeg søger er et sql-kald, der ud fra et givent id finder det "lavere" og "højere" ID såvidt at det findes hvis sql-kaldets where-betingelser opfyldes (se nedenfor - det er afgrænset af dir_id). Meningen med det er, at når man klikker sig ind på et billede, skal man få et thumbnail af forrige og næste billlede i mappen.

Indtil videre har jeg lavet denne løsning:

SELECT
    i.image_id,
    i.filename,
    i.note,
    u.images_width_small,
    u.images_width_large
FROM
    images AS i,
    users AS u
WHERE
    i.user_id = '".$_GET['u_id']."' AND
    i.image_id <= '".($_GET['image_id']+1)."' AND
    i.image_id >= '".($_GET['image_id']-1)."' AND
    u.user_id = i.user_id AND
    i.dir_id = '".$_GET['dir_id']."'

Den virker også fint for det meste! - Men hvis der er "klumper" i id'erne - fx hvis billederne i mappen med dir_id = 3 har image_id'erne 3, 5 og 7 - så virker det ikke udfra ovenstående eksempel. Så vil den ikke finde billede 3 og 7 selvom de rent faktisk kommer før og efter billede 5 i den mappe som billede 5 ligger i.

Jeg er godt klar over jeg bare kan lave tre sql-kald. Et med =, et med < og limit 1 og et med > og limit 1 - men hvis man kan gøre det i et kald ville det jo være federe! =)

Håber i forstår mit spørgsmål.

På forhånd tak.

- Rasmus
Avatar billede arne_v Ekspert
07. december 2005 - 23:06 #1
Jeg tror at du er nødt til at lave en UNION af 3 SELECT
Avatar billede showsource Seniormester
09. december 2005 - 03:10 #2
eller også kun hente id'er fra hvert dir_id og smide dem i et array, og bruge array_search() til at finde forrige og næste id

Og hvorfor kun en query?
Umiddelbart ser det ud som om du f.eks. henter "small-width" og "large_width" men du bruger vel ikke det hele ved samme visning?
Avatar billede Slettet bruger
09. december 2005 - 15:25 #3
Et kald kan ikke lade sig gøre. Tre kald er den simple løsning, som du allerede har gennemskuet. Og så er der mulighed for at nøjes med to kald:

Et, der henter med < og LIMIT 1
Et, der henter med >= og LIMIT 2 og ORDER BY i.image_id
Avatar billede Slettet bruger
09. december 2005 - 15:28 #4
NB! Den virker kun, hvis der rent faktisk er et billede med det ID, der bliver bedt om. Hvis der f.eks eksisterer billeder med id: 3,5,7 vil de komme frem, når man beder om et billede med id=4.
Avatar billede arne_v Ekspert
09. december 2005 - 15:54 #5
man kan godt lave et kald med en UNION af 3 SELECT
Avatar billede Slettet bruger
09. december 2005 - 15:59 #6
OK, jeg formulerede det forkert. Jeg mente, at man ikke kan lave det med kun en SELECT. Der skal mindst to til.
Avatar billede razmuz_dk Nybegynder
04. april 2006 - 00:41 #7
Løsningen blev en UNION - smid et svar arne :)
Avatar billede arne_v Ekspert
04. april 2006 - 01:22 #8
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester