09. maj 2007 - 21:19Der er
12 kommentarer og 3 løsninger
left join
Jeg har et spørgsmål om hvordan jeg får sammensat den rette SQL sætning.
Jeg har følgende tre tabeller: fotos(id, filename), sider(id, side) og fotosSider(id, fotoId, sideId). Når et foto bliver tilføjet en side så vil et record i fotosSider blive oprettet med henholdsvis et fotoId og sideId.
Jeg vil gerne lave et udtræk hvor jeg får alle fotos og samtidig information om de er tilknyttet en bestemt side. Det skal siges at et foto godt kan være tilknyttet flere sider.
Jeg har selv prøvet med denne sætning: SELECT fotos.filename as filename, fotosSider.sideId FROM fotos LEFT JOIN fotosSider ON fotos.id = fotosSider.fotoId
Problemet er bare at jeg med dette SQL sætning får dobbelt record for de fotos som går igen på flere sider.
Jeg håber at dette er tilstrækkelig information. hvis ikke så skriv endelig.
Så det du vil er at få at vide om et foto er tilknyttet en side, men ikke hvad siden er? Hvis du samtidig vil vide hvad siden er, kan du da ikke undgå at få dobbeltgængere...
I dit recordset er der jo kun 2 felter, og der kan ikke gemmes flere værdier end 2 i dem. Altså er der nødt til at være flere records for det samme foto.
Du er muligvis nødt til at lave et recordset mere, som har alle fotos. Du løber så det recordset igennem en for en, og viser resultatet fra det andet recordset hvor der er et match på fotoid.
Tak for dit bud freak_dk, jeg har desværre først mulighed for at kigge på dit forslag efter weekenden, men vender jeg tilbage når jeg har prøvet dit forslag.
Det kan godt være at jeg misforstår dit løsningsforslag men jeg har jo recordsættet fotos(id, filename) hvor alle fotos optræder. Så har jeg recordsættet fotosSider(id, fotoId, sideId) som indeholder fotoId på alle de fotos der er tilknyttet en side.
Til dit første sprøgsmål: Så det jeg gerne vil vide er om et foto er tilknyttet en bestemt side med et kendt sideId.
OK, nu tror jeg det begynder at dæmre. Ja den er tricky. ... må lige lægge hjernen lidt i blød. Jeg tror ikke det bare kan gøres med en join. Er der mon andre der har et bud?
Har du forresten set der er en GROUP BY du kan tilføje i dit SELECT-statement.
Din SQL-sætning kommer til at se nogenlunde sådan her ud: SELECT fotos.filename as filename, fotosSider.sideId FROM fotos LEFT JOIN fotosSider ON fotos.id = fotosSider.fotoId GROUP BY filename
SELECT fotos.filename as filename, fotosSider.sideId FROM fotos LEFT JOIN ( SELECT fotoSider.fotoId, fotosSider.sideId, Sider.Side FROM fotosSider INNER JOIN Sider ON fotosSider.SideId = Sider.Id ) AS Tmp ON fotos.id = Tmp.fotoId WHERE Tmp.Side IS NULL OR Tmp.Side = 10
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.