Avatar billede larsholmgaard_dk Nybegynder
09. august 2006 - 23:08 Der 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.

Nogen, der kan hjælpe mig på vej?
Avatar billede kjulius Novice
09. august 2006 - 23:48 #1
Vel noget lignende dette:

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'
Avatar billede kjulius Novice
09. august 2006 - 23:57 #2
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...
Avatar billede larsholmgaard_dk Nybegynder
10. august 2006 - 10:52 #3
Hej kjulius, tak for det.. Men, jeg kan ikke lige helt få det til at virke - der kommer ingen resultater?
Avatar billede kjulius Novice
10. august 2006 - 12:29 #4
Får du en fejlmelding?
Avatar billede larsholmgaard_dk Nybegynder
10. august 2006 - 16:58 #5
Nøh... der kommer bare ingen resultater. Hvordan er det jeg får udskrevet fejlmeldinger?
Avatar billede larsholmgaard_dk Nybegynder
10. august 2006 - 17:29 #6
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
Avatar billede kjulius Novice
10. august 2006 - 21:01 #7
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."

Hvilken version af MySQL kører du på?
Avatar billede kjulius Novice
10. august 2006 - 21:10 #8
Alternativt kunne du forsøge dig med:

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
Avatar billede larsholmgaard_dk Nybegynder
13. august 2006 - 22:36 #9
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. ;)

Læg et svar...
Avatar billede larsholmgaard_dk Nybegynder
13. august 2006 - 22:48 #10
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
Avatar billede kjulius Novice
13. august 2006 - 23:31 #11
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
Avatar billede larsholmgaard_dk Nybegynder
14. august 2006 - 22:24 #12
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!

Læg bare et svar. :-)
Avatar billede kjulius Novice
14. august 2006 - 23:04 #13
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. :-)
Avatar billede larsholmgaard_dk Nybegynder
29. august 2006 - 11:04 #14
Hov, beklager der gik så lang tid før jeg accepterede dit svar - det troede jeg faktisk allerede jeg havde gjort. :-)
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