[Alg/SQL] Kandidaten matchen op vacatures

Pagina: 1
Acties:

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Ik zal even proberen uit te leggen wat de situatie is en wat mijn probleem is. Ik ben bezig met een vacaturebank. Nu heb zijn er kandidaten die hun profiel willen matchen op de vacatures. Dat houdt in dat een kandidaat zijn profiel opgeeft, waarna er bij een zoekopdracht een bepaald aantal vacatures uit komt rollen die overeenkomen met dat profiel.

Dat matchen moet gebeuren op basis van zogenaamde profiel details. Dit zijn bepaalde vragen die in een profiel in te vullen zijn en voor vacatures in te vullen zijn. (je kunt daarbij denken aan omgeving, type werk, salaris, etc.). Nu hoeven niet alle gegeven antwoorden op die profiel details overeen te komen, maar de best overeen komende vacatures moeten wel boven aan komen.

Nu heb ik dus de volgende tabellen in de database:
-Kandidaten
-Vacatures
-ProfielDetails
-ProfielDetailOpties
-VacatureProfielDetailKeuzes
-KandidaatProfielDetailKeuzes

De laatste 2 zijn in princiepe gewoon koppel/associatie tabellen.

Het probleem dat ik heb is dat ik niet goed weet hoe ik de tabellen kan koppelen op zo'n manier dat bepaalde profiel details niet overeen hoeven te komen. Ik weet bijvoorbeeld wel dat er een left join bestaat, maar dat betekent eigenlijk dat alle vacatures geselecteerd worden, of dat de best overeenkomende op 1 profiel detail bovenaan komen. Je kan immers (volgens mij) niet sorteren op meerdere kolommen met gelijke behandeling. (Ik zou ook niet weten hoe het anders zou moeten)

De vraag is dus hoe ik een query construeer die zo'n complexe select goed doet. Is dit uberhaubt mogelijk? Indien dat niet zo is, waar kan dan meer informatie vinden over problemen als deze?

Noushka's Magnificent Dream | Unity


Verwijderd

Je zou eventueel voor iedere mogelijke combinatie de VacatureProfielDetailKeuzes- en de KandidaatProfielDetailKeuzestabel een losse JOIN kunnen maken, deze vervolgens GROUP-en en met een COUNT het aantal links kunnen tellen. Als je dit deelt door het aantal mogelijke links en maal 100 doet, heb je volgens mij een percentage van hoeveel deze matchen. Maar ik doe dit uit mijn blote kop, dus ik zou een denkfout kunnen maken.

HTH :)

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Ik snap je methode niet helemaal. Laat ik eerst even de tabellen iets uitgebreider weergeven (alleen de relevante kolommen dan):

Kandidaten
-kandidaatID

Vacatures
-vacatureID

ProfielDetails
-profielDetialID

ProfielDetailOpties
-profielDetailOptieID
-profielDetailID

VacatureProfielDetailKeuzes
-vacatureID
-profielDetailOptieID

KandidaatProfielDetailKeuzes
-kandidaatID
-profielDetailOptieID

Uit je reactie begrijp ik dat ik de 2 koppel tabellen moet joinen voor iedere ProfielDetailOptie. Maar hoe ik dat precies zou moeten doen weet ik niet. Zou je een klein voorbeeldje kunnen geven?

Noushka's Magnificent Dream | Unity


Verwijderd

Nogmaals, ik doe dit uit mijn hoofd en op basis van een idee dat misschien helemaal niet gaat werken, want dit is wel een taaie, en ik ben slecht in dingen puur uit mijn hoofd doen.

Als ik het goed begrijp, zou de volgende query per vacature en kandidaat het aantal matchende profieldatailopties moeten teruggeven. Als jet het totaal aantal profieldetailopties kan ophalen, zou je hieruit een matchingspercentage moeten kunnen berekenen.
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT VacatureID, KandidaatID, COUNT(ProfielDetailID)
FROM 
   Vacature V LEFT JOIN VacatureProfielDetailKeuzes VK 
      ON V.VacatureID = VK.VacatureID
      LEFT JOIN ProfielDetailOpties VPO 
         ON VK.ProfielDetailOptieID = VPO.ProfielDetailOptieID
   Kandidaat K LEFT JOIN KandidaatProfielDetailKeuzes KK 
      ON K.KandidaatID = KK.KandidaatID
      LEFT JOIN ProfielDetailOpties KPO 
         ON KK.ProfielDetailOptieID = KPO.ProfielDetailOptieID
WHERE
   VKO.ProfielDetailID = KPO.ProfielDetailID
GROUP BY
   VacatureID, KandidaatID

Ik hoop dat het werkt, zo niet ... zie mijn disclaimer. :)

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Bedankt voor je reactie. Ik ga even kijken wat ik hiermee kan doen. Als ik meer weet plaats ik het gelijk. :)

Noushka's Magnificent Dream | Unity


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Ik ben vandaag hier eens weer serieus aan begonnen. Ik heb geprobeerd je query te gebruiken, maar die lijkt toch niet helemaal goed te werken. Hij lijkt gewoon het aantal gekozen items in het profiel van een vacature terug te geven en bij opties waar meerdere antwoorden mogelijk zijn worden ze zelfs dubbel getelt, on afhankelijk van of de optie ook door de kandidaat gekozen is. De query is verder eigenlijk zo complex dat het een beetje buiten mijn kennis (van sql) valt. Mischien dat je zelf een idee hebt waarom dat gebeurt.

Anders nog andere mensen die een suggestie hebben? Mischien is dit wel gewoon niet te doen in 1 query. Ook een strategie hoe dit in meerdere stappen efficient op te lossen is, is welkom.

Noushka's Magnificent Dream | Unity


  • Hydra
  • Registratie: September 2000
  • Laatst online: 22-01 13:59
Verkeerde software ;)

-> http://www.wcc.nl/

https://niels.nu


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Ik ben er weer eens mee bezig. Probeer het toch werkend te krijgen. De situatie is iets aangepast. Ik heb nu de volgende tabellen:

vacancy
-vacancy_id

profile_detail
-profile_detail_id

vacancy_profile_detail_choise
-vacancy_id
-profile_detail_id

Vanuit een zoek pagina kan een keuze gemaakt worden uit profiel details waarna de best matchende vacatures worden weergegeven. Nu heb ik er voor gekozen om eerst te controleren hoeveel van de gekozen profiel details overeenkomen bij iedere vacature. Die lijst wil ik dan sorteren en de bovenste zeg 20 vacatures weergeven. Op zich geen probleem, dacht ik. Alleen loop ik hier gelijk al weer vast. Een query die ik had bedacht is deze:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
    v.vacancy_id,
    v1.profile_detail_id AS v1_profile_detail_id,
    v2.profile_detail_id AS v2_profile_detail_id
FROM
    vacancy v,
    vacancy_profile_detail_choise v1,
    vacancy_profile_detail_choise v2
WHERE
    ( v.vacancy_id = v1.vacancy_id AND v1.profile_detail_id = 1 )
OR
    ( v.vacancy_id = v2.vacancy_id AND v2.profile_detail_id = 5 )

Dit is een query die gegenereerd wordt als profiel detail opties met id 1 en 5 zijn gekozen. Op zich werkt dit wel, alleen wel met de nodige problemen. Het eerste probleem is dat er een hoop dubbele resultaten tussen zitten. Hoe meer opties er gekozen zijn, hoe meer dubbelen. Dat lijkt ook exponentieel te stijgen.

Het 2de probleem is dat er ook veel valse resultaten zijn. Zo heeft v1_profile_detail_id maar een paar keer ook echt de waarde 1 net als dat v2_profile_detail_id ook maar een paar keer de waarde 5 heeft. Ze hebben gewoon alle mogelijke waarden uit alle IDs van de profiel details. Bij mijn weten is dat helemaal niet mogelijk, omdat ik met v1.profile_detail_id = 1 expliciet opgeef welke waarde het moet hebben. Waarom het dat dan toch niet heeft is me een raadsel.

Enig idee wat ik fout doe? Bij het oplossen van het 2de probleem is het 1ste niet zo lastig denk ik.

Noushka's Magnificent Dream | Unity

Pagina: 1