SQL - avancerad SELECT sats

Tråden skapades och har fått 7 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Stockholm
  • 2004-01-30 22:46

Hej!

Jag har ett gallri på g !

Använder mig av tre tabller.
1. Albums (innehåller album som har en kort beskrivning till sig)
2. Images (innehåller adresser till olika bilder samt en kommentar till varje bild)
3. AlbumImages (innehåller endast referenser till ett album och en bild på varje rad)

Ja ni förstår säkert...
Jag tänkte göra en liten browser för att kika på bilderna i albumet.. har inte riktigt kommit på någon lösning som jag är nöjd med. Den jag är inne på just nu skulle kräva en sql-sats som jag är osäker på om den ens finns

Jag tänker mig ungefär såhär

function getAlbumImage($album, $offset ="0") {
   $query = mysql_query("SELECT i.src,
                                                    offset(i.id) as imageNum
                                                    COUNT(*) AS imageTotal
                                        FROM images i, albumimags ai
                                        WHERE ai.image_id = i.id
                                            AND kdjaklfjadj
                                       ") or die("getAlbumImage(): " . mysql_error());
}

Som ni ser har jag hittat på en liten snutt där...
Anvädnder inte heller offset för jag kom på att då fungerar kanske inte COUNT(*) men annars så tänkte jag använda offset för att få fram en önskad bild i serien... dvs en bildserie accessas alltid genom att bläddra med $offset="0" upp till $offset=numImagesInAlbum(), ja ni förstår va?
Appropå queryn ...
jag vill få ut följande information:
1. bildfilens adress
2. vilken bild i serien det är
3. totala antalet bilder i serien
För man vill ju skriva ut typ

<-- Visa föregående bild [ visar bild 5 av 17 ] Visa Nästa bild-->

Har jobbat 09-20 3 dar irad och känner mig heeelt okreativ för tillfället...

Mvh
ivar

  • Medlem
  • Stockholm
  • 2004-02-05 09:33

Hej!

Grubblandet fortsätter..

Nu är jag inne på att ha en sql-sats som ser ut typ såhär

mysql_query("
SELECT image_id
FROM gallery_album_images
WHERE album_id = '$album_id'
   AND image_id = '$image_id'
LIMIT 2
");

Grejen är att jag VET att den där är fel, men försöker visa tanken bara... jag vill alltså hämta 2st bilder där den båda MÅSTE tillhöra albumet men bara den ena måste vara $image_id... så tänkte jag att man med DESC och ASC ska kunna framkalla "Föregående - Nästa" effekten.. ?

Något i stil med det här borde väl fungera?

SELECT image_id
FROM gallery_album_images
WHERE album_id = '$album_id'
  AND image_id >= '$image_id'
ORDER BY image_id ASC
LIMIT 2;

I och med att vi först har en WHERE-sats som sorterar bort alla ID-nummer som är mindre än $image_id och sedan sorterar efter kolumnen 'image_id', så kommer den post som innehåller $image_id att komma först.

Lägg till ett ordningstal till din rad i tabellen AlbumImages, så att bilderna får ett löpnummer, 1, 2, 3 osv.

Sedan är det bara att för din nästa och föregående använda 1+nuvarnade nummer och 1-nuvarnade nummer och göra en selectsats som väljer ut dessa bilder med tre sökargument istället, kanske du behöver göra matematiken i PHP eller vad du nu använder som Middleware.

(Kan tillägga att detta görs automatiskt i Lasso med detta:

[Link_PrevRecord]<-- Föregående bild[/Link_PrevRecord]

[Link_NextRecord]Nästa bild --> [/Link_NextRecord]

http://ldml.blueworld.com/LDMLReference.0.LassoApp?tag=143

Hihi!)

  • Medlem
  • Stockholm
  • 2004-02-05 22:26

Ja precis, image_id fungerar INTE som löpnummer men annars hade Samuels lösning fungerat utmärkt!
Ola, din lösning var nog bäst men det fick ändå bli som så att jag hämtade hem id för alla bilder i albumet för då kunde jag samtidigt säga vilken bild i serien man för nuvarande kollar på .. något i stil med (4/10).

Nu fungerar alltså "Föregående" och "Nästa" länkarna... skitskönt!
Tack för hjälpen ialla fall! Ni får hjälpa till med skumma buggar i övriga html-koden istället
(se egen tråd med safaribugg)

Ursprungligen av ivar:

Ja precis, image_id fungerar INTE som löpnummer men annars hade Samuels lösning fungerat utmärkt!
Ola, din lösning var nog bäst men det fick ändå bli som så att jag hämtade hem id för alla bilder i albumet för då kunde jag samtidigt säga vilken bild i serien man för nuvarande kollar på .. något i stil med (4/10).

Det är nog faktiskt bästa lösningen i det här fallet. Olas lösning med tre kriterier i WHERE-satsen fungerar i idealfallet, men tar man bort en bild ur arkivet får man ett "hål" i sekvensen vilket förstör navigeringen. Vill du ha något liknande men mer robust måste du köra med löpnummer och ORDER BY / LIMIT.

Riktigt men på det finns det två lösningar - numrera om alla bilder när man tar bort eller lägger till bilder, eller så gör man tre sökningar:

aktuellt id
vilket id som är högre än mitt (större än sökning alltså)
vilket id som är lägre än mitt (minde än)

/Ola
P.S. Om jag inte är helt sammanhängnde är det för att jag varit vaken i 28 timmar och försöker på så vis vända tillbaka dygnet rätt..

Ursprungligen av Taz_1999:

Riktigt men på det finns det två lösningar - numrera om alla bilder när man tar bort eller lägger till bilder, eller så gör man tre sökningar:

aktuellt id
vilket id som är högre än mitt (större än sökning alltså)
vilket id som är lägre än mitt (minde än)

/Ola
P.S. Om jag inte är helt sammanhängnde är det för att jag varit vaken i 28 timmar och försöker på så vis vända tillbaka dygnet rätt..

Egentligen så räcker det ju med två sökningar:

id strikt mindre än aktuellt id
id större än eller lika med aktuellt id

Den första sökningen begränsas sedan lämpligast till en post, och den andra till två. Det är lite svårt att göra i en och samma SELECT-sats bara, utan det behövs två SELECTs kombinerade med UNION (om man nu ska göra hela söknings/sorteringsbiten på databassidan det vill säga).

1
Bevaka tråden