Combinaties Query
in php een output weergeven met als hoogst de totale 5 combinaties
en daaronder 4 combinaties enz
Dus je zegt dan niks over het aantal variabelen of over de grote groep variabelen.
5 combinaties met daaronder 4 combinaties kunnen een gelijksoortig antwoord terug geven. Alleen zijn het dus eerst 5 antwoorden en dan 4 antwoorden.
Wat dit verder met jQuery van doen heeft laat zich maar te raden ..
Wat je concrete vraag nu eigenlijk is ... geen idee ...
het maximale (hoogste score) is tot nu toe 5 combinaties
dus ik krijg bijvoorbeeld als resultaat $een gecombineerd met $twee en gecombineerd met $drie en $gecombineerd met $vier en $vijf dus in match-term is dit een hit van 100%
daarna komt 4 combinaties/hits die een mindere in match-term percentage haalt
het probleem is als ik die mysql uitvoer alles door elkaar krijg als resultaat
ik zou 1 tabel maken voor vacatures
dan 1 tabel voor items die de vacature ranking bepalen.
Je ranking tabel kan er dan zo uit zien:
ID, VacatureID, item_type, item_value.
Je item_type kan dan zijn: Werkervaring, Locatie, Naam_Functie
SELECT VacatureID, count(VacatureID) as score FROM ranking WHERE Werkervaring LIKE '%".$een."%' OR Werkervaring LIKE '%".$twee."%' OR Werkervaring LIKE '%".$drie."%' OR Locatie LIKE '%".$vier."%' OR Naam_Functie LIKE '%".$vijf."%'" GROUP BY VacatureID
Ik denk dat je dan terug krijgt:
1, 4 (vacature 1 matched met 4 qualiteiten)
2, 3 (vacature 2 matched met 3 qualiteiten)
3, 5 (enz ...)
Kan je dit proberen? Ik weet namelijk niet zeker of het klopt. Komt in ieder geval erg in de buurt ...
Gewijzigd op 07/09/2012 14:22:46 door Flip --
Toevoeging op 07/09/2012 15:01:34:
ik doe COUNT(id) as score en het geeft alleen 1-en ik output het als volgt $row3->score
aah uitstekend
$result3 = $mysqli->query("SELECT id, Locatie, Werkervaring, Naam_Functie, COUNT(id) as score FROM vacaturesfuncties WHERE Werkervaring LIKE '%".$een."%' OR Werkervaring LIKE '%".$twee."%' OR Werkervaring LIKE '%".$drie."%' OR Locatie LIKE '%".$vier."%' OR Naam_Functie LIKE '%".$vijf."%' ORDER BY score DESC, id DESC");
maar krijg nu alleen 1 resultaat (ipv 24)
http://database-programmer.blogspot.nl/2008/04/group-by-having-sum-avg-and-count.html
Aggregation, eerste paragraaf
"Then the simple query above produces a one-row output"
net zoals jij hebt ...
Is dus niet echt een verrassing ofzo ...
is er niet een manier met <code> $result3 = $mysqli->query("SELECT id, Locatie, Werkervaring, Naam_Functie, COUNT(id) as score FROM vacaturesfuncties WHERE Werkervaring LIKE '%".$een."%' OR Werkervaring LIKE '%".$twee."%' OR Werkervaring LIKE '%".$drie."%' OR Locatie LIKE '%".$vier."%' OR Naam_Functie LIKE '%".$vijf."%' </code>
beschrijving hoe de code moet werken:
[GEEF RESULTATEN MET ALLE VIJF MOGELIJKE COMBINATIES BOVENAAAN]
[GEEF RESULTATEN MET ALLE VIER MOGELIJKE COMBINATIES DAARONDER]
[enz]
Toevoeging op 08/09/2012 14:34:43:
want hoe het nu is geeft hij eerst id = 0 dan id = 1 etc
Gewijzigd op 08/09/2012 14:32:57 door Francoi gckx
Al eerder gegeven:
SELECT VacatureID, count(VacatureID) as score FROM ranking WHERE Werkervaring LIKE '%".$een."%' OR Werkervaring LIKE '%".$twee."%' OR Werkervaring LIKE '%".$drie."%' OR Locatie LIKE '%".$vier."%' OR Naam_Functie LIKE '%".$vijf."%'" GROUP BY VacatureID
Voor sortering toevoegen: ORDER BY count(VacatureID)
SELECT VacatureID, count(VacatureID) as score FROM ranking WHERE Werkervaring LIKE '%".$een."%' OR Werkervaring LIKE '%".$twee."%' OR Werkervaring LIKE '%".$drie."%' OR Locatie LIKE '%".$vier."%' OR Naam_Functie LIKE '%".$vijf."%'" GROUP BY VacatureID ORDER BY count(VacatureID)
Eventueel zou je ook "ORDER BY score" kunnen gebruiken, maar ik weet niet zeker of MySQL dit ondersteund. Even proberen zelf ..
Voor de duidelijkheid ... deze oplossing werk niet als je ook niet de tabel ranking aanmaakt.
Gewijzigd op 08/09/2012 14:40:10 door Flip --
als ik GROUP BY id ORDER BY count(id) ook zelfde resultaat weer op volgorde van id
en ORDER BY score ondersteunt die niet volgens mij
Ik begrijp dat het een beetje moeilijk oplossing is, zal eens zien om een demo te maken.
de tweede tabel is om met behulp van queries te matchen (waar ik nu in vastloop)
dus zou ik volgens jou een derde tabel maken nl zo:
ID, VacatureID, item_type, item_value.
item_type daar worden de labels van de waardes geplaats
en item_value daar worden dan $een t/m $vijf geplaats?
Toevoeging op 08/09/2012 14:53:46:
Flip ik waardeer je hulp en de tijd die je er in steekt zeer veel ik hoop dat we er samen uitkomen
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CREATE TABLE IF NOT EXISTS `vacatures` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Beschrijving` text NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
INSERT INTO `vacatures` (`ID`, `Beschrijving`) VALUES
(1, 'Vuilnisman'),
(2, 'Minister');
CREATE TABLE IF NOT EXISTS `vacatures_eigenschappen` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`VacatureID` int(10) unsigned NOT NULL,
`item_type` tinytext NOT NULL,
`item_value` tinytext NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
INSERT INTO `vacatures_eigenschappen` (`ID`, `VacatureID`, `item_type`, `item_value`) VALUES
(1, 1, 'Locatie', 'Amsterdam'),
(2, 2, 'Locatie', 'Amsterdam'),
(3, 1, 'Werkervaring', '1 jaar'),
(4, 2, 'Werkervaring', '2 jaar');
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Beschrijving` text NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
INSERT INTO `vacatures` (`ID`, `Beschrijving`) VALUES
(1, 'Vuilnisman'),
(2, 'Minister');
CREATE TABLE IF NOT EXISTS `vacatures_eigenschappen` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`VacatureID` int(10) unsigned NOT NULL,
`item_type` tinytext NOT NULL,
`item_value` tinytext NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
INSERT INTO `vacatures_eigenschappen` (`ID`, `VacatureID`, `item_type`, `item_value`) VALUES
(1, 1, 'Locatie', 'Amsterdam'),
(2, 2, 'Locatie', 'Amsterdam'),
(3, 1, 'Werkervaring', '1 jaar'),
(4, 2, 'Werkervaring', '2 jaar');
Query:
Code (php)
1
SELECT VacatureID, count(VacatureID) as score FROM vacatures_eigenschappen WHERE (item_type = 'Werkervaring' AND item_value LIKE '%1 jaar%') OR (item_type = 'Locatie' AND item_value LIKE '%Amsterdam%') GROUP BY VacatureID ORDER BY score DESC
Resultaat:
VacatureID score
1 2
2 1
Uitleg:
Gezocht op:
Locatie = Amsterdam
Werkervaring = 1 jaar
Vacature 1 voldoet aan alletwee deze eigenschappen heeft daarom een score van 2.
Vacature 2 voldoet maar aan één van de twee eigenschappen omdat er een werkervaring van 2 jaar wordt gevraagd, deze krijgt daarom maar een score van 1.
-----
3 opmerkingen
1. was zelf vergeten dat ik de eigenschappen (items) uitsplitst in naam & waarde. Daarom dat ik er nu een AND heb toegevoegd.
2. Vacature beschrijving staat nu de functie naam, maar deze moet natuurlijk ook naar vacature_eigenschappen verplaatst worden uiteindelijk. Waarbij item_type = 'Naam_Functie'
3. Eigenschappen die meetellen voor de ranking gaan in vacatures_eigenschappen (vacatures_ranking is misschien duidelijker wel). En eigenschappen (zoals telefoonnummer van de contactpersoon) gaan gewoon bij vacature erbij.
Gewijzigd op 08/09/2012 15:02:35 door Flip --
Toevoeging op 08/09/2012 15:10:51:
demo werkt dus ik ga nu kijken waarom dat zo is:)
Hoeveel eigenschappen voldoet een vacature aan ?
Als deze eigenschappen dan in kolommen staan kan SQL dat niet verwerken en zul je het in PHP moeten doen.
Van item_type zou ik trouwens een ENUM maken in plaats van een TINYTEXT (my bad !)
Gewijzigd op 08/09/2012 15:14:30 door Flip --
14 kolommen maar zoiets als Werkervaring heeft een blok tekst waaruit ik bepaalde woorden moet halen om te matchen
Locatie = Amsterdam
en
Werkervaring = ... lang verhaal ...
in dezelfde type kolom moet zetten. Slecht voor optimalisatie enzo. Pak in dit geval een kolom type waar alles inpast.
Je zou dit kunnen oplossen door je query slim samen te stellen in PHP.
Je vacatures_eigenschappen ziet er dan zo uit:
ID, VacatureID, item_type, locatie, werkervaring.
Waarbij locatie en werkervaring hun eigen juist type hebben.
Omdat item_type al bekend is bij het samenstellen van de query weet je dan ook welke kolom de bijbehorende waarde staat.
SELECT VacatureID, count(VacatureID) as score FROM vacatures_eigenschappen WHERE (item_type = 'Werkervaring' AND werkervaring LIKE '%1 jaar%') OR (item_type = 'Locatie' AND locatie LIKE '%Amsterdam%') GROUP BY VacatureID ORDER BY score DESC
Als je de inhoud van deze tabel bekijkt dan valt op dat van de kolommen locatie, werkervaring, etc.. er altijd maar één is ingevuld per rij.
Op het eerste gezicht lijkt het op hoe je het nu doet (aan de kolommen te zien), maar vergis je niet. Dit is wezenlijk anders! Per vacature zijn er nog steeds meerdere rijen (van eigenschappen). Zodat deze telbaar zijn.
Gewijzigd op 08/09/2012 15:27:44 door Flip --
ik ga even alles doornemen en dan laat ik je horen of het heeft gewerkt