Avatar billede elskermad.dk Nybegynder
22. januar 2009 - 17:02 Der 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

Hvordan kan jeg se dette?
Avatar billede arne_v Ekspert
23. januar 2009 - 02:50 #1
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.

Det første virker attraktivt på mig.
Avatar billede elskermad.dk Nybegynder
23. januar 2009 - 14:55 #2
jeg vil gerne kunne klare det hele i sql'en så det sidste virker mest attraktivt for mig :) mener du noget specielt når du skriver self join?
Avatar billede arne_v Ekspert
24. januar 2009 - 03:27 #3
self join er når man joiner en tabel med sig selv

lad os tage med 2:

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
Avatar billede elskermad.dk Nybegynder
03. december 2009 - 13:33 #4
smider du et svar?
Avatar billede arne_v Ekspert
03. december 2009 - 14:54 #5
ok
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