Combinaties Query
hoe kan ik met deze query,: $result3 = $mysqli->query("SELECT id, Locatie, Werkervaring, Naam_Functie FROM vacaturesfuncties WHERE Werkervaring LIKE '%".$een."%' OR Werkervaring LIKE '%".$twee."%' OR Werkervaring LIKE '%".$drie."%' OR Locatie LIKE '%".$vier."%' OR Naam_Functie LIKE '%".$vijf."%'");
in php een output weergeven met als hoogst de totale 5 combinaties
en daaronder 4 combinaties enz
in php een output weergeven met als hoogst de totale 5 combinaties
en daaronder 4 combinaties enz
5 combinaties wilt zeggen dat je 5x een groepje variabelen haalt uit een nog grotere verzameling variabelen.
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 ...
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 ...
met query bedoel ik mysql
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
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
mijn leesfout, ik las jQuery in plaats van query :)
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 ...
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 --
ik haal de waardes $een t/m $vijf weer uit een ander tabel maar je heb me wel wat ideeen gegeven met count en group by dank daarvoor.
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
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
nu is mijn qeury zo:
$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)
$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)
Lees op die webpagina
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 ...
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 ...
Ok ik heb het artikel doorgelezen maar weet je wat het is met count is dat hij dan maar 1 resultaat weergeeft namelijk de totale aantal resultaten in dit geval geeft hij ook de bovenste resultaat (van de tabel) en als ik ook count echo ernaast doe krijg je de som van de totale bevindingen, is niet wat ik wil
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
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
COUNT() geeft meerdere rijen terug in combinatie met GROUP BY
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.
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 doe krijg ik zelfde resultaat: rangschikkend op id (van 0 tot "19")
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
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.
ik werk nu met twee tabels een tabel waar ik $een tot met $vijf vandaan haal
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
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
Tabellen & data:
Query:
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.
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 --
dat is snel thumbs up ik ga de demo uittesten
Toevoeging op 08/09/2012 15:10:51:
demo werkt dus ik ga nu kijken waarom dat zo is:)
Toevoeging op 08/09/2012 15:10:51:
demo werkt dus ik ga nu kijken waarom dat zo is:)
Omdat als je iets wilt tellen in MySQL dit in rijen moet staan.
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 !)
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
Dat is wel een beetje het lelijke aan deze oplossing dat je
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.
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 --
dus eigenlijk moet ik alles waarop ik wil matchen in vacatures_eigenschappen item_value zetten
ik ga even alles doornemen en dan laat ik je horen of het heeft gewerkt
ik ga even alles doornemen en dan laat ik je horen of het heeft gewerkt




