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")
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
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
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
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
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
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?
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
Grunden til at min to forslag med subselect ikke virker, skyldes at man først fra version 5 af mysql kan lave subselect.
Synes godt om
Ny brugerNybegynder
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.