22. januar 2009 - 17:02Der er
4 kommentarer og 1 løsning
alle rækker i en tabel skal være i en anden tabel
Hej Eksperter!
Jeg har følgende problemstilling:
Jeg har en tabel med personaleoplysninger. Dertil har jeg en tabel med oplysninger om personens kompetencer, som refererer til en kompetencetabel.
Jeg skal nu lave en forespørgsel hvor jeg skal om personen bestrider alle kompetencer (kommasepereret med værdien som kompetencen er beskrevet i kompetencetabellen)
Tabelstrukturerne følger her:
CREATE TABLE `ansat` ( `id` int(12) NOT NULL auto_increment, `navn` varchar(55) NOT NULL default '', PRIMARY KEY (`id`) );
CREATE TABLE `ansat_kompetence` ( `id` int(12) NOT NULL auto_increment, `ansat` int(12) NOT NULL default '0', `kompetence` int(12) NOT NULL default '0', PRIMARY KEY (`id`) );
CREATE TABLE `kompetence` ( `id` int(12) NOT NULL auto_increment, `navn` varchar(55) NOT NULL default '', PRIMARY KEY (`id`) );
Hvis Hans Hansen har kompetencerne 1, 4, 9 og 13 (ud af fx 20 poster i kompetencetabellen) så skal jeg kunne se om han har de fornødne kompentecer - så hvis;
(1,9) > OK (2,4,9,18) > IKKE OK (9) > OK (1,4,13) > OK (8) > IKKE OK
Du har efter min mening valgt den rigtige tabel struktur (jeg ville have overvejet at have bruge en sammensat primary key fremfor id i sammenknytnings tabellen, men ingen stor forskel).
Du kan gøre to ting:
SELECT * FROM (ansat JOIN ansat_kompetance ON ansat.id=ansat_kompetance.ansat) JOIN kompetance ON ansat_kompetance.kompetance=kompetance.id WHERE navn='Hans Hansen'
og så lad din applikation checke om alle de fornødne kompetancer er i output.
Eller så skal du lave en self join med de 2 sidste tabeller det antal gange du søger efter kompetancer.
SELECT * FROM (ansat JOIN ansat_kompetance ak1 ON ansat.id=ak1.ansat) JOIN ansat_kompetance ak2 ON ansat.id=ak2.ansat) WHERE navn='Hans Hansen' AND ak1.kompetance=1 AND ak2.kompetance=9
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.