Avatar billede natsprinter Nybegynder
07. april 2008 - 11:19 Der er 9 kommentarer

Sammenskriv tre tabeller i én SQL forespørgsel

Jeg har følgende sql som volder lidt problemer i forhold til HASTIGHED – det fungerer fint, men jeg er sikker på at det vil være bedre at sammenskrive det i en sql forespørgsel.

Det er kompliceret (i forhold til mine evner) ved at det er en sammenfletning af tre tabeller. Kan du vise mig, hvordan det skal se ud med join af tre tabeller?

I tabellen ”bem” ligger der en masse beskeder fra brugere. Det recordsæt henter jeg i første kald.

For hver post i det recordsæt skal jeg hente brugernavn fra tabellen ”brugere” samt foto af brugeren fra tabellen billeder. Jeg har læst mig til, at det er noget med INNER JOIN kombineret med LEFT JOIN, men det giver ikke meget mening for mig.

' hent besked det den aktuelle bruger

sql = "SELECT brugerid, besked from bem where billedeid = "&fotoID&" ORDER BY id DESC"

set bemStr = conn.execute(sql)

do while not bemStr.eof

' hent oplysninger om brugeren samt billede

set brugerStr = conn.execute("select brugernavn from bruger where id = "& bemStr("brugerid")&" LIMIT 1")

set fotoStr = conn.execute("select id, thumbnail from billeder where brugerid = "& bemStr("brugerid")&" LIMIT 1")

thumbStr = replace(fotoStr("thumbnail"),"upload/thumbnails/","",1,-1,1)

%>



HER SKAL DER UDSKRIVES EN MASSE



<%                                     

bemStr.moveNext
loop
Avatar billede dkfire Nybegynder
07. april 2008 - 11:52 #1
Måske noget ala:
SELECT bem.besked, bruger.brugernavn, billeder.id, billeder.thumbnail FROM bem, bruger, billeder WHERE bruger.id = bem.brugerid AND billeder.brugerid = bem.brugerid AND bem.billedeid = "&fotoID&" ORDER BY bem.id DESC
Avatar billede natsprinter Nybegynder
07. april 2008 - 12:38 #2
Ja, det er et godt bud, og det henter også data fra min MySql. Der blot et problem: Den samme bruger kan godt ha uploaded flere billeder under sit brugernavn Det betyder at denne forespørgsel:

SELECT bem.besked, bruger.brugernavn, billeder.id, billeder.thumbnail
FROM bem, bruger, billeder
WHERE bruger.id = bem.brugerid
AND billeder.brugerid = bem.brugerid
AND bem.billedeid =6312
ORDER BY bem.id DESC
LIMIT 0 , 30

Giver et recordsæt, hvor alle uploadede billeder af brugeren fremkommer. Der skal kunne komme et billede
Avatar billede natsprinter Nybegynder
07. april 2008 - 12:44 #3
Eller sagt på en anden måde. Recordsætte kommer til at indeholde den samme kommentar lige så mange gange som det antal billeder brugeren har uploaded.
Avatar billede dkfire Nybegynder
07. april 2008 - 13:02 #4
Ja så skal du have fat i noget join med limit, eller også kan der måske bruges DISTINCT.
Noget ala:
SELECT DISTINCT bem.besked, bruger.brugernavn, billeder.id, billeder.thumbnail
FROM bem, bruger, billeder
WHERE bruger.id = bem.brugerid
AND billeder.brugerid = bem.brugerid
AND bem.billedeid =6312
ORDER BY bem.id DESC
LIMIT 0 , 30
Avatar billede dkfire Nybegynder
07. april 2008 - 13:16 #5
Ellers kan vi prøve noget:

SELECT bem.besked,
FROM bem
JOIN
( SELECT brguernavn FROM bruger LIMIT 1) x ON x.id = bem.brugerid
JOIN
(SELECT id, thumbnail FROM billeder LIMIT 1) y ON y.brugerid = bem.brugerid
WHERE
bem.billedeid =6312
ORDER BY bem.id DESC
LIMIT 0 , 30
Avatar billede dkfire Nybegynder
07. april 2008 - 13:26 #6
Eller hvis det er mysql 5 du kører er der mulighed for sup select

SELECT bem.besked,
  (SELECT bruger.brguernavn
  FROM bruger
  WHERE bruger.id = bem.brugerid
  LIMIT 1), 
  (SELECT billeder.id, billeder.thumbnail
  FROM billeder
  WHERE billeder.brugerid = bem.brugerid
  LIMIT 1)
FROM bem
WHERE bem.billedeid =6312
ORDER BY bem.id DESC
LIMIT 0 , 30

Men ved ikke lige om der skal subselectes flere kolonner og om en as muligvis er påkrævet
Avatar billede natsprinter Nybegynder
07. april 2008 - 14:52 #7
Uanset om jeg benytter DISTINCT eller ej, giver det præcis det samme recordsæt. Jeg anvender mySQL Version  4.1.18 - som ligger på DanDomain. Ingen af ovenstående eksempler virker.

Undre mig over hvor "x" og "y" kommer fra, når der ikke er anvendt et alias?
Avatar billede natsprinter Nybegynder
07. april 2008 - 22:24 #8
Har leget lidt med JOIN LEFT - og denne virker, men giver dog stadig det problem, at der ikke vælges unikke poster, men én post for hvert billede i billede tabellen. Men nu er SQL da strammet lidt op - nu skal jeg bare finde løsningen på redundans i det endelige recordset.

SELECT m.brugerid, m.besked, b.brugernavn, t.id, t.thumbnail
FROM bem AS m
LEFT JOIN bruger AS b ON b.id = m.brugerid
LEFT JOIN billeder AS t ON t.brugerid = m.brugerid
WHERE m.billedeid =6312
ORDER BY m.id DESC
LIMIT 30
Avatar billede dkfire Nybegynder
08. april 2008 - 00:48 #9
Grunden til at min to forslag med subselect ikke virker, skyldes at man først fra version 5 af mysql kan lave subselect.
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