09. august 2006 - 23:08Der er
13 kommentarer og 1 løsning
Kombinere to queries til ét kald?
Ehm... jeg har lige brug for lidt hjælp til en querystring - nu har jeg siddet med den i et par timer uden at komme videre, så er der en venlig sjæl, der kan hjælpe, vil jeg blive meget glad.
To the point. Jeg har lavet dette kald, som henter SagID, Firmanavn, Website og Beskrivelse for alle åbne sager fra to forskellige tabeller (kundedatabase og sagsdatabase): $query = "SELECT SagID, Firmanavn, Website, Beskrivelse FROM KundeDB, SagDB WHERE KundeDB.kundeID = SagDB.kundeID AND Slutdato='0000-00-00'";
Og så har jeg lavet denne, der sammenregner antal timer per sag: $query = "SELECT sagID, SUM(antalTimer) AS timerIalt FROM timerDB GROUP BY sagID ";
Hvis jeg nu gerne vil have timerIalt op i den øverste querystring - hvordan gør jeg det? I bund og grund vil jeg bare gerne hive SagID, Firmanavn, Website, Beskrivelse OG den beregnede timerIalt ud, men jeg kan ikke rigtigt få det til at virke.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
SELECT SagDB.SagID, Firmanavn, Website, Beskrivelse, timerIalt FROM KundeDB INNER JOIN SagDB ON KundeDB.kundeID = SagDB.kundeID INNER JOIN ( SELECT sagID, SUM(antalTimer) AS timerIalt FROM timerDB GROUP BY sagID ) AS tDB ON tDB.sagID = sagDB.sagID WHERE Slutdato='0000-00-00'
Eller måske var det bedre at bruge en LEFT JOIN, hvis man ikke kan være sikker på, at der er oprettet timerecords til alle sager:
SELECT SagDB.SagID, Firmanavn, Website, Beskrivelse, COALESCE(timerIalt, 0) AS timerIalt FROM KundeDB INNER JOIN SagDB ON KundeDB.kundeID = SagDB.kundeID LEFT JOIN ( SELECT sagID, SUM(antalTimer) AS timerIalt FROM timerDB GROUP BY sagID ) AS tDB ON tDB.sagID = sagDB.sagID WHERE Slutdato='0000-00-00'
Normalt ville der blive returneret en null værdi hvis der ingen timer er registreret, men COALESCE funktionen erstatter null med 0. Det er ikke sikkert det er nødvendigt i din situation...
Ah! Ved den første version du skrev får jeg følgende:
#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT sagID, SUM( antalTimer ) AS timerIalt FROM timerDB GROU
MySQL fra version 4.1 burde supportere "derived tables":
Fra MySQL manualen: "MySQL 4.1 supports subqueries and derived tables. A “subquery” is a SELECT statement nested within another statement. A “derived table” (an unnamed view) is a subquery in the FROM clause of another statement."
SELECT SagDB.SagID, Firmanavn, Website, Beskrivelse, SUM(COALESCE(antalTimer, 0)) AS timerIalt FROM KundeDB INNER JOIN SagDB ON KundeDB.kundeID = SagDB.kundeID LEFT JOIN timerDB ON timerDB.sagID = sagDB.sagID WHERE Slutdato='0000-00-00' GROUP BY SagDB.SagID, Firmanavn, Website, Beskrivelse
Undskyld jeg først vender tilbage nu - hektisk weekend. Jeg ved faktisk ikke hvilken version af MySQL der køres med - men, dit sidste forslag virker fint! MANGE tak for hjælpen, det sætter jeg stor pris på! Nu kan jeg komme videre med mit lille projekt. ;)
Argh... sorry, jeg er vist lidt for træt til at kigge på det nu efter at have bygget hus om hele weekenden. Jeg havde glemt at remarke en senere query ud og den gav derfor et andet resultat, som jeg lige et øjeblik troede var det rigtige, men det var det desværre ikke.
Versionsnummeret er 4.0.24 ifølge phpinfo();
Hvis jeg kører din seneste version i phpmyadmin, så får jeg denne besked tilbage:
MySQL returnerede: #1052 - Column: 'beskrivelse' in field list is ambiguous
Det tyder på, at feltnavnet ikke er entydig (altså, at det optræder i flere tabeller). Du er derfor nødt til at angive fra hvilken af tabellerne feltet skal tages, f.eks.:
SELECT SagDB.SagID, Firmanavn, Website, SagDB.Beskrivelse, SUM(COALESCE(antalTimer, 0)) AS timerIalt FROM KundeDB INNER JOIN SagDB ON KundeDB.kundeID = SagDB.kundeID LEFT JOIN timerDB ON timerDB.sagID = sagDB.sagID WHERE Slutdato='0000-00-00' GROUP BY SagDB.SagID, Firmanavn, Website, SagDB.Beskrivelse
SÅDAN! Mange, mange tak - nu har jeg hul igennem og kan komme videre. Jeg har stadig meget at lære omkring de lidt mere kryptiske databasekald, så tak for din venlighed og tålmodighed!
Godt, men der er nu ingen grund til at takke så meget. Vi står alle en gang i mellem i situationer, hvor vi ikke kan komme videre. Som oftest er det bare en lille ting, som vi ser os blind på. Så er det godt at hente inspiration udefra. :-)
Hov, beklager der gik så lang tid før jeg accepterede dit svar - det troede jeg faktisk allerede jeg havde gjort. :-)
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.