23. februar 2006 - 11:41Der er
4 kommentarer og 1 løsning
Sidste post i en join
Hejsa,
Jeg har et problem hvor jeg skal joine to tabeller. Den ene indeholder sendinger og den anden en historik over statusen. Der kan derfor godt være mange statuser til hver sending
Jeg ønsker derfor et udtræk hvor jeg får alle sendinger, og derefter den sidste status på hver sending. Jeg har iøjeblikket følgende udtryk:
SELECT MAX(trace.statustekst) as status, gxtabel.Fmnr FROM trace LEFT JOIN gxtabel on gxtabel.Fmnr = trace.Fmnr where gxtabel.Exnr=" .$exnr. " group by gxtabel.Fmnr"
Bruger jeg funktionen MAX, får jeg kun sorteret efter alfabetisk orden, og ikke sidste status.
Hvis jeg putter "order by trace.id" på i enden, hvor id er auto_numeric, så får jeg sortering på den tabel jeg har brugt "group by" på - altså sendingstabelen. Det jeg ønsker var jo at få sortering på statustabelen, men det lader sig umildbart kun gøre når jeg bruger en funktion efter "select"
SELECT MAX(trace_a.id), trace_b.id, trace_b.statustekst AS status FROM trace AS trace_a, trace AS trace_b, gxtabel WHERE gxtabel.Exnr = <noget> AND gxtabel.Fmnr = trace_b.Fmnr GROUP BY status, trace_b.id HAVING MAX(trace_a.id) = trace_b.id
Ovenstående er ikke testet, men jeg har afprøvet princippet på en mysql-databse og det virker. Idéen er at joine trace-tabellen med sig selv og bruge HAVING-delen til at vælge de rækker fra, som ikke er de nyeste. Put selv en ORDER BY på i enden, hvis du gerne vil have det.
Fungerer ikke. Svartiden bliver op til 10 sek. og resultatet bliver helt forkert. Desuden kan man jo forestille sig at der ikke er nogen status til sendingen, og denne vil ikke blive vist hvis ikke man bruger LEFT JOIN. Men det lyder jo underligt hvis man er nød til at lave to SQL-udtryk for at løse dette problem ???
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.