Avatar billede Slettet bruger
19. december 2008 - 15:34 Der er 11 kommentarer og
1 løsning

Brug af join, subquery eller union

Hej

Jeg har et problem med en SQL query. Jeg har følgende tabeller:

Table: correct
+-----------+-----------+
| correctID | subjectID |
+-----------+-----------+
|        1 |        10 |
|        1 |        4 |
|        2 |      7.11 |
|        2 |        3 |
|        2 |        10 |
+-----------+-----------+

Table: error
+---------+-----------+
| errorID | subjectID |
+---------+-----------+
|      1 |        3 |
|      1 |      7.11 |
|      2 |        10 |
|      2 |        3 |
|      2 |        10 |
|      2 |        10 |
+---------+-----------+

Den ene tabel error indeholder emner der har været fejl i, til en prøve og den anden holder de emner der har været rigtige til prøven. Tallene i subjectID er hvilket emne der var fejl i. Det jeg skal bruge af hvor mange provent af feks 10 er rigtige. Feks er der 2 af emne 10 rigtige og der er 5 ialt derfor 2/5*100 = 40% rigtige af emne 10.

Jeg har prøvet at lavet noget med join, subquery og union men har ikke kunne få lavet noget. Er der nogen som kan være behjælpelige?

Hilsen Michael
Avatar billede arne_v Ekspert
19. december 2008 - 16:47 #1
prøv:

SELECT subjectid,ncorrect*1.0/nerror FROM
(SELECT subjectID,COUNT(*) AS ncorrect
FROM correct
GROUP BY subjectid) x,
(SELECT subjectID,COUNT(*) AS nerror
FROM error
GROUP BY subjectid) y
WHERE x.subjectid=y.subjectid
Avatar billede Slettet bruger
19. december 2008 - 17:24 #2
Ja den virkede, skulle bare bruge (ncorrect*100/(ncorrect+nerror)) istedet for ncorrect*1.0/nerror.

Udover det, er det så muligt at alle dem hvor der er 100% fejl, også kommer med på listen?
Avatar billede arne_v Ekspert
19. december 2008 - 19:38 #3
prøv:

SELECT subjectid,IFNULL(ncorrect,0)*100/nerror FROM
(SELECT subjectID,COUNT(*) AS ncorrect
FROM correct
GROUP BY subjectid) x RIGHT JOIN
(SELECT subjectID,COUNT(*) AS nerror
FROM error
GROUP BY subjectid) y
ON x.subjectid=y.subjectid
Avatar billede Slettet bruger
22. december 2008 - 10:33 #4
Ja det virker.

Men hvordan er det smartest at gøre med SELECT subjectid, subjectID er ambiguous, men hvis man bruger x.subjectID kan der være tilfælde hvor den ikke findes og det samme med y.subjectID. Er det fint at bruge IFNULL(x.subjectid,y.subjectid) ?
Avatar billede Slettet bruger
22. december 2008 - 11:38 #5
Glem det sidste jeg skrev, har luret den :)

En sidste ting: Er der nogen mulighed for at lave en OUTER join efter den er blevet fjernet?

og smid venligst et svar.
Avatar billede Slettet bruger
22. december 2008 - 13:04 #6
Fandt ud af det så jeg ikke behøver at bruge outer join.

Mit sidste problem er bare jeg køre MySql 5.0 lokalt, men på serveren køre den 4.0 og der melder den fejl. Synes ellers ikke der er noget som ikke skulle kunne køre i 4.0.

Mit query endte med er se således ud:

SELECT y.subjectid,tss.partSubject,weighting, IFNULL(nerror,0)*100/(IFNULL(ncorrect,0)+nerror) AS result, IF(y.subjectID is null, 1,0) AS orderby
FROM subjectweighting tss
LEFT JOIN (SELECT subjectID,COUNT(*) AS ncorrect FROM correct_partsubject GROUP BY subjectID) AS x ON tss.subjectid = x.subjectid
LEFT JOIN (SELECT subjectID,COUNT(*) as nerror FROM errors_partsubject GROUP BY subjectID) AS y ON tss.subjectid = y.subjectid
ORDER BY orderby DESC, weighting DESC;
Avatar billede arne_v Ekspert
22. december 2008 - 15:07 #7
At selecte fra en select kraever 4.1 ....

:-(
Avatar billede arne_v Ekspert
22. december 2008 - 15:07 #8
Og et svar
Avatar billede arne_v Ekspert
22. december 2008 - 15:08 #9
4.0 er oldgammel

(5.1 er current)
Avatar billede Slettet bruger
22. december 2008 - 17:31 #10
Må hellere få opdateret serveren så :). Ved du om 5.1 er bagudkompatibel`?

Mange tak for hjælpen.
Avatar billede arne_v Ekspert
22. december 2008 - 17:43 #11
Rimeligt.

Jeg vil anbefale at lave et dump og restore fremfor at forsoege at opgradere tabeller. Saa
er det nemt at forsoege flere gange hvis der er noget som driller.

Hvis der er noget som driller saa er det sandsynligvis charset. MySQL har forbedret
deres support af forskellige charsets of collationer meget siden 4.0.
Avatar billede Slettet bruger
22. december 2008 - 17:46 #12
ok, tak.
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