Avatar billede spejder_leon Nybegynder
31. januar 2010 - 23:40 Der er 10 kommentarer og
1 løsning

SQL til at finde alle der har deltaget på givne kurser

Jeg skal bruge en sql der kan vise hvilke personer der opfylder givne krav vedr. deltagelse på et dynamisk antal kurser.

Tabeller og deres væsentligste felter:

t_person.id
t_person.navn

t_kursus.id
t_kursus.navn

t_kursusAfholdelse.id
t_kursusAfholdelse.dag

t_kursusAfholdelseDeltagere.id
t_kursusAfholdelseDeltagere.kursusId (FK til t_kursus.id)
t_kursusAfholdelseDeltagere.personId (FK til t_person.id)


t_certificering.id
t_certificering.navn

t_certificeringKursusKrav.id
t_certificeringKursusKrav.CertificeringId (FK til t_certificering.id)
t_certificeringKursusKrav.kursusId (FK til t_kursus.id)



Jeg definerer således i t_certificering forskellige klasser af certificering (guld, sølv, bronze)
I t_certificeringKursusKrav angiver jeg så de krævede kombinationer af kurser som giver et certificet ekempelvis, hvis guld certifikat kræver kursus 1, 2 og 3, sølv kursus 1 og 2, og bronze kursus 4 så ville jeg oprette de følgende 6 rækker i t_certificeringKursusKrav

Guld,kursus1
Guld,kursus2
Guld,kursus3
sølv,kursus1
sølv,kursus2
bronze,kursus4


--------------

Tilsvarende når en deltager deltog på et kursus, så ville denne deltager blive oprettet som en række i t_kursusAfholdelseDeltagere



----
Opgaven er nu at laven en SQL der skriver hvilke personer der har hvilke certifikater:

person1, guld
person1, sølv
person2, bronze
...


På forhånd tak
01. februar 2010 - 06:01 #1
Det vil jeg da gerne give et bud paa hvis jeg kan blive sikker paa at forstaa det med kursuskombinationer og certifikater.  fra det du kort sketserer kan jeg se adskillige muligheder.

Fra dit eksempel kunne jeg gaette at du har kursus-raekker saaledes at kursus 1 ikke giver certifikat men er indgangskrav for kursus 2 der giver soelv og som er indgangskrav til kursus 3 der giver guld.  Er det korrekt?  Har du saa adskillige saadanne raekker saa en person for eksempel kan have guld i livredning og soelv i orientering og kursus 1 i tovvaerksarbejder?  Og saa synes du derudover at have enkeltkurser der giver bronze saasom kursus 4.

Hvis ovenstaaende er korrekt saa er en konsekvens at en person ikke kan have guld i et 'fag' med mindre personen ogsaa har soelv i samme fag, men en person kan have guld i livredning og soelv i orientering. 

Lad os saa antage at person1 har guld (og derfor soelv) i livredning, soelv i orientering, bronze i tovvaerksarbejde, skopudsning, og frikadellelavning hvilket resultat vil du saa have? 

Skal der staa:  Person1 guld(1), soelv(2) (livredning og orientering), bronze(2) 

eller Person1 guld(1), soelv(1) (for livredning er soelvet indeholdt i guldet) bronze(2)? 

eller simpelthen at person1 har guld i et eller flere fag plus soelv i et eller flere andre fag plus bronze i et eller flere igen andre fag?  Saa person1 guld, soelv og bronze?

Men i det sidste tilfaelde, hvis person2 saa har guld i livredning og orientering og saaledes er laengere fremme end person1 saa bliver statestikken person1 guld og soelv, person2 guld hvilket kunne synes at person2 er bagud.

Summa summarum, fortael mere om kurser, certifikater, og hvad resultat du vil se, saa skal jeg komme op med en SQL query.
Avatar billede spejder_leon Nybegynder
01. februar 2010 - 08:13 #2
Hej Christian_Belgien,

Din tanke om at der er tale om en kursusrække er spændende og godt set. Det er dog ikke tanken at der skal være den form for trin i certificeringen.

Jeg har blot nævnt tre certificeringer, guld, sølv og bronze, men der skal kunne tilføjes flere eksempelvis kunne man tænke sig certificeringen: "skopudser" bestod af tre kurser: sko-snøring, skopudsning og besøg på skofabrik.

Altså at skal man kunne oprette nye kurser og nye certificeringer dynamisk.

Det skal så resultere i:

+----------+--------------+
+ Guld    + Person1  +
+----------+--------------+
+ sølv    + Person2  +
+----------+--------------+
+ bronze  + Person4  +
+----------+--------------+
+ skopuds+ Person5  +
+----------+--------------+
+ Sølv    + Person6  +
+----------+--------------+
+ Sølv    + Person7  +
+----------+--------------+

Håber dette opklarer opgaven
Avatar billede spejder_leon Nybegynder
01. februar 2010 - 08:15 #3
... Og ja, Person1 - ville naturligvis have sølv også, som skulle skrives med ud på listen, så den korrekte ville være:



+----------+--------------+
+ Guld    + Person1  +
+----------+--------------+
+ Sølv    + Person1  +
+----------+--------------+
+ sølv    + Person2  +
+----------+--------------+
+ bronze  + Person4  +
+----------+--------------+
+ skopuds+ Person5  +
+----------+--------------+
+ Sølv    + Person6  +
+----------+--------------+
+ Sølv    + Person7  +
+----------+--------------+
01. februar 2010 - 20:32 #4
Nej, jeg beklager, det kan jeg ikke umiddelbart finde ud af.  Det kraever metoder som det er for laenge siden jeg har arbejdet med.

Men spoergsmaalet interesserer mig nok til at jeg vil laese op paa det og proeve at loese det om et par dage hvis det til den tid stadig er aktuelt (og der ikke er andre eksperten medlemmer der svarer forinden.)

Hvis det skal loeses i sql skal jeg i gang med stored procedures som der kun er begraenset support for i mit mysql system.  Hvis det ikke lykkedes saa maa jeg nok ty til php for procedurerne med data hentet fra mysql hvis det er i orden.

Fortael mig om jeg skal gaa i gang eller om det i mellemtiden er lige meget.
Avatar billede spejder_leon Nybegynder
01. februar 2010 - 21:36 #5
Tak for forsøget - Opgaver er nu at løse det i ren sql - at anvende hjælpekode er absolutte nødløsning... og vil helst undgås...
02. februar 2010 - 13:45 #6
I saafald maa jeg hellere bakke ud.  Det er ikke realistisk at jeg finder en loesning.  Jeg har prioriteringskonflikter.  Jeg haaber du finder hjaelp paa anden maade.
Avatar billede terry Ekspert
02. februar 2010 - 17:22 #7
Dont have much time right now but if you can send a dB with tables/data then I'll see if I can find a bit of time to see if I can find a solution (no guaranties).

ekspertenATsanthell.dk
AT = @
07. februar 2010 - 17:18 #8
spejder-leon, forventer du flere indlaeg paa denne traad?  Friske indlaeg er sjaeldne paa spoergsmaal der er en uges tid gamle og uden (synlig) aktivitet i adskillige dage.  Med mindre der er "baggrundsaktivitet" i gang (jeg saa et tilbud fra et andet medlem om at kikke paa det hvis han kunne faa tables/data) vil jeg foreslaa at du lukker spoergsmaalet.  Det giver god orden, og saa staar det ikke laengere som aabent i min liste af indlaeg.  Du vil jo saa nok skulle give dig selv pointsene, men saa har du dem og kan give dem hvis du senere faar resultat fra anden side.
12. september 2010 - 22:36 #9
spejder-leon, jeg proever lige en gang mere.  Du oprettede dette spoergsmaal og jeg engagerede mig i det med hensigten, frivilligt og gratis, at bidrage til loesning af problemet.  Selv om det ikke lykkedes mig, saa gjorde jeg en indsats, og jeg haaber stadig at du nu vil lukke spoergsmaalet (ved selv at oprette et svar og acceptere det) og ikke lade mig blive haengende i et evigheds-aabent spoergsmaal.
Avatar billede spejder_leon Nybegynder
14. september 2010 - 09:56 #10
Hej Christian,

Tak for din tid og dit engagement.

Jeg håbede, måske lidt naivt, at der ville komme et svar der løste problemet. Men det er jo nok urealistisk så jeg lukker.
14. september 2010 - 10:13 #11
Tak fordi du endelig fjernede spoergsmaalet fra min liste over indlaeg der er aabne.

Ja, jeg synes det er urealistisk at forvente friske indlaeg paa et spoergsmaal oprettet for mere end et halvt aar siden.  Saa er det da bedre at lukke og saa oprette et nyt spoergsmaal (som Eksperten tillader for spoergsmaal der er mere end en uge gamle.)
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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