Mysql Kwestie geen zelfde id

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Francoi gckx

Francoi gckx

27/02/2014 14:00:04
Quote Anchor link
Ik heb het volgende query-resultaat:

Afbeelding

Ik wil de vacatures met een cv matchen
de kolommen uit de tabel van de vacatures hebben een bv_ prefix
elke vacature is gekoppeld aan benodigheden en die hebben een vb_ prefix

De bv_id is uiteindelijk belangrijk maar die mogen maar 1 keer voor komen
omdat er een vacature (bv_id=22) bij zit met twee benodigheden laat hij ze
twee keer zien.

Welke functie die in mysql zit kan ik toepassen op welke kolom?
Gewijzigd op 27/02/2014 14:00:55 door Francoi gckx
 
PHP hulp

PHP hulp

25/04/2024 18:17:44
 
Michael -

Michael -

27/02/2014 14:03:34
Quote Anchor link
Het is sowieso handig om altijd een kolom met unieke id's te hebben. Hoe kun je nou 2 de zelfde id's hebben.
Om de juiste te krijgen zou je nou dus op bv_id en vb_id moeten selecteren omdat geen van beide uniek is. Als die combinatie ook niet uniek is faalt het sowieso.
 
Francoi gckx

Francoi gckx

27/02/2014 14:08:28
Quote Anchor link
vb_id is natuurlijk wel uniek dat is primary van benodigheden

Toevoeging op 27/02/2014 14:09:40:

ok dus op vb_id selecteren even kijken hoor
 
Michael -

Michael -

27/02/2014 14:12:27
Quote Anchor link
Uniek? Dan lijkt het me niet gewenst dat ie op NULL staat (2e regel). Daar kun je dus niks mee.
 
Francoi gckx

Francoi gckx

27/02/2014 14:12:56
Quote Anchor link
Het werkt niet de query is zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT bv.bv_id, bv.bv_functie, bv.bv_plaats, bv.bv_categorie, vb_id, bv_beschrijving, vb.vb_id,
COUNT(*) AS total_matches, GROUP_CONCAT(gc.matched_word) AS matched_words

FROM ( SELECT  bv_id, 'webdeveloper' AS matched_word FROM beheer_vacatures WHERE bv_functie LIKE '%webdeveloper%'
UNION SELECT  bv_id, 'webdeveloper' AS matched_word FROM beheer_vacatures WHERE bv_categorie LIKE '%webdeveloper%'
UNION SELECT  bv_id, 'helleb' AS matched_word FROM beheer_vacatures WHERE bv_plaats LIKE '%helleb%'

UNION SELECT  bv_id, 'tsw1' AS matched_word FROM beheer_vacatures WHERE bv_beschrijving LIKE '%tsw1%'
UNION SELECT  bv_id, 'kb1' AS matched_word FROM beheer_vacatures WHERE bv_beschrijving LIKE '%kb1%'

UNION SELECT  vb_id, 'tsw1' AS matched_word FROM vacature_benodigheden WHERE vb_benodigheden LIKE '%tsw1%'
UNION SELECT  vb_id, 'kb1' AS matched_word FROM vacature_benodigheden WHERE vb_benodigheden LIKE '%kb1%'
) AS gc

INNER JOIN beheer_vacatures AS bv ON gc.bv_id = bv.bv_id
LEFT JOIN  vacature_benodigheden vb ON bv.bv_id = vb.bv_id  

GROUP BY gc.bv_id, bv.bv_id,  vb_id, bv.bv_functie, bv.bv_plaats, bv.bv_categorie, vb.vb_id, bv_beschrijving ORDER BY total_matches DESC


Toevoeging op 27/02/2014 14:13:53:

Michael - op 27/02/2014 14:12:27:
Uniek? Dan lijkt het me niet gewenst dat ie op NULL staat (2e regel). Daar kun je dus niks mee.


Dat is omdat bv_id 15 geen benodigheden heeft



Toevoeging op 27/02/2014 16:21:56:




Michael - op 27/02/2014 14:12:27:
Uniek? Dan lijkt het me niet gewenst dat ie op NULL staat (2e regel). Daar kun je dus niks mee.


Dat is omdat bv_id 15 geen benodigheden heeft

Na wat geklooi en met het fragmentje hier onder ben ik een stukje verder,
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
LEFT JOIN  (SELECT bv_id
    FROM vacature_benodigheden GROUP BY bv_id) vb
ON gc.bv_id = vb.bv_id  
 
Erwin H

Erwin H

27/02/2014 17:00:41
Quote Anchor link
Even een paar opmerkingen:
1) gebruik geen GROUP BY om unieke waardes te selecteren, maar DISTINCT. Een GROUP BY is bedoeld om bepaalde gevonden rijen te groeperen en zo bepaalde kolommen te kunnen sommeren bijvoorbeeld. Een GROUP BY is in principe alleen geldig in combinatie met een aggregate functie die jij hier niet gebruikt. DISTINCT gebruik je als je alleen unieke combinaties wilt hebben van de geselecteerde kolommen. Dit is wat jij doet. Je query zou dus moeten zijn:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
SELECT DISTINCT bv_id
FROM vacature_benodigheden

2) Als je resultaten via een UNION aan elkaar plakt hoef je niet de kolom alias bij elke selectie te plaatsen. In de uiteindelijk resultset kan elke kolom maar 1 naam hebben, dus alleen bij de eerste SELECT in de UNION hoef je een eventuele alias op te geven, de rest volgt per definitie. Scheelt je code en maakt je query een stuk beter leesbaar.

Verder is me niet helemaal duidelijk of je probleem nu is opgelost of niet :-)
Gewijzigd op 27/02/2014 17:01:09 door Erwin H
 
Francoi gckx

Francoi gckx

27/02/2014 18:09:07
Quote Anchor link
1. Ok helder, dat geeft ook hetzelfde resultaat als met GROUP BY.

2. Ok copy that.

Over het resultaat gesproken ben ik niet content mee als ik dus alleen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
SELECT DISTINCT bv_id
FROM vacature_benodigheden


Ok dan laat die in iedergeval maar 1 keer een bv_id van 22 zien

Maar toch blijf ik een probleem houden als een matched_word dubbel is in welke kolom dan ook
dan telt hij dat niet meer mee. (Legenda;) de stippen zijn de daadwerklijke match getallen)

Afbeelding

Met de query zo staan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT bv.bv_id,  bv.bv_functie, bv.bv_plaats, bv.bv_categorie,  bv_beschrijving, vb.vb_id, vb.vb_benodigheden,
COUNT(*) AS total_matches, GROUP_CONCAT(gc.matched_word) AS matched_words

FROM ( SELECT  bv_id, 'webdeveloper' AS matched_word FROM beheer_vacatures WHERE bv_functie LIKE '%webdeveloper%'
UNION SELECT  bv_id, 'webdeveloper' AS matched_word FROM beheer_vacatures WHERE bv_categorie LIKE '%webdeveloper%'
UNION SELECT  bv_id, 'helleb' AS matched_word FROM beheer_vacatures WHERE bv_plaats LIKE '%helleb%'

UNION SELECT  bv_id, 'tsw1' AS matched_word FROM beheer_vacatures WHERE bv_beschrijving LIKE '%tsw1%'
UNION SELECT  bv_id, 'kb1' AS matched_word FROM beheer_vacatures WHERE bv_beschrijving LIKE '%kb1%'

UNION SELECT bv_id, 'tsw1' AS matched_word FROM vacature_benodigheden WHERE vb_benodigheden LIKE '%tsw1%'
UNION SELECT  bv_id, 'kb1' AS matched_word FROM vacature_benodigheden WHERE vb_benodigheden LIKE '%kb1%'
) AS gc

INNER JOIN beheer_vacatures AS bv ON gc.bv_id = bv.bv_id
LEFT JOIN  (SELECT DISTINCT bv_id, vb_id,  vb_benodigheden
    FROM vacature_benodigheden) vb
ON gc.bv_id = vb.bv_id  

GROUP BY gc.bv_id, vb_id, bv.bv_id, vb_benodigheden,  bv.bv_functie, bv.bv_plaats, bv.bv_categorie, bv_beschrijving ORDER BY total_matches DESC
Gewijzigd op 27/02/2014 18:11:22 door Francoi gckx
 
Erwin H

Erwin H

27/02/2014 18:43:33
Quote Anchor link
Het lukt me op dit moment even niet om er echt diep in te duiken, maar als ik het goed begrijp krijg je bepaalde resultaten nu niet te zien? Als dat het geval is dan kan dat liggen aan je UNION. Een UNION selecteert over het algemeen alleen alle verschillende rijen. Je zou kunnen proberen daar UNION ALL van te maken. Alleen ik vraag me af of dat je helpt, want dan zou je hooguit twee keer hetzelfde resultaat uit die subquery krijgen. Volgens mij kan dat nooit zijn wat je wilt.
 
Francoi gckx

Francoi gckx

27/02/2014 19:05:53
Quote Anchor link
Dat heeft beter gewerkt dan ervoor op een paar dingen na:D bv_categorie en bv_functie hebben allebei webdeveloper in zich.
En het telt en neemt in de matched_words alleen die van bv_categorie of bv_functie op.

Ik heb wat meer waardes die moeten match erbij gevoegd
en je heb waarschijnlijk gelijk met dat die maar twee keer hetzelfde resultaat laat zien
Afbeelding

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT DISTINCT bv.bv_id,  bv.bv_functie, bv.bv_plaats, bv.bv_categorie,  bv_beschrijving, vb.vb_id, vb.vb_benodigheden,
COUNT(*) AS total_matches, GROUP_CONCAT(gc.matched_word) AS matched_words

FROM ( SELECT  bv_id, 'webdeveloper' AS matched_word FROM beheer_vacatures WHERE bv_functie LIKE '%webdeveloper%'
UNION ALL SELECT  bv_id, 'webdeveloper' AS matched_word FROM beheer_vacatures WHERE bv_categorie LIKE '%webdeveloper%'
UNION ALL SELECT  bv_id, 'helleb' AS matched_word FROM beheer_vacatures WHERE bv_plaats LIKE '%helleb%'

UNION ALL SELECT  bv_id, 'tsw1' AS matched_word FROM beheer_vacatures WHERE bv_beschrijving LIKE '%tsw1%'
UNION SELECT  bv_id, 'kb1' AS matched_word FROM beheer_vacatures WHERE bv_beschrijving LIKE '%kb1%'

UNION ALL SELECT  bv_id, 'tsw1' AS matched_word FROM vacature_benodigheden WHERE vb_benodigheden LIKE '%tsw1%'
UNION ALL SELECT  bv_id, 'kb1' AS matched_word FROM vacature_benodigheden WHERE vb_benodigheden LIKE '%kb1%'
) AS gc

INNER JOIN beheer_vacatures AS bv ON gc.bv_id = bv.bv_id
LEFT JOIN  (SELECT DISTINCT bv_id, vb_id,  vb_benodigheden
    FROM vacature_benodigheden) vb
ON gc.bv_id = vb.bv_id  

GROUP BY gc.bv_id, vb_id, bv.bv_id, vb_benodigheden,  bv.bv_functie, bv.bv_plaats, bv.bv_categorie, bv_beschrijving ORDER BY total_matches DESC
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

27/02/2014 20:13:50
Quote Anchor link
Als ik wat gecompliceerdere query's heb test ik deze altijd eerst uit in mijn db-tool.

Indien ik dan andere resultaten krijg dan verwacht, dan ga ik stukje bij beetje wat voor resultaten ik krijg als ik bv alleen een subquery uitvoer.

En laat eens zien wat dan de uitkomst is van de eerste subquery, dan kunnen we wat beter beoordelen.

En volgens mij heeft de subquery in de LEFT JOIN geen enkel nut.
 
Francoi gckx

Francoi gckx

27/02/2014 22:18:10
Quote Anchor link
Ok hij geeft nu de goeie aantallen en alle woorden.

Als ik nu geen left join doe kan ik vb_benodigheden en vb_id niet renderen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT  bv.bv_id,  bv.bv_functie, bv_plaats, bv_categorie,  bv_beschrijving,
vb_benodigheden, vb_id,
COUNT(*) AS total_matches, GROUP_CONCAT(gc.matched_word) AS matched_words

FROM ( SELECT  bv_id, bv_functie, 'webdeveloper' AS matched_word FROM beheer_vacatures WHERE bv_functie LIKE '%webdeveloper%'
UNION ALL SELECT  bv_id,  bv_categorie, 'webdeveloper' AS matched_word FROM beheer_vacatures WHERE bv_categorie LIKE '%webdeveloper%'
UNION ALL SELECT  bv_id,  bv_plaats, 'helleb' AS matched_word FROM beheer_vacatures WHERE bv_plaats LIKE '%helleb%'

UNION ALL SELECT  bv_id,  bv_beschrijving, 'tsw1' AS matched_word FROM beheer_vacatures WHERE bv_beschrijving LIKE '%tsw1%'
UNION ALL SELECT  bv_id,  bv_beschrijving, 'kb1' AS matched_word FROM beheer_vacatures WHERE bv_beschrijving LIKE '%kb1%'

UNION ALL SELECT  bv_id, vb_benodigheden, 'tsw1' AS matched_word FROM vacature_benodigheden WHERE vb_benodigheden LIKE '%tsw1%'
UNION ALL SELECT  bv_id, vb_benodigheden, 'kb1' AS matched_word FROM vacature_benodigheden WHERE vb_benodigheden LIKE '%kb1%'
) AS gc

INNER JOIN beheer_vacatures  bv ON gc.bv_id =  bv.bv_id
LEFT JOIN  (SELECT bv_id, vb_benodigheden, vb_id
    FROM vacature_benodigheden) vb
ON gc.bv_id = vb.bv_id  

GROUP BY bv.bv_id,bv_functie, bv_plaats,  bv_categorie,  bv_beschrijving, vb_benodigheden, vb_id ORDER BY total_matches DESC


resultaat:

Afbeelding

Als ik group_Concat doe op vb_benodigheden en vb_id

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT  bv.bv_id,  bv.bv_functie, bv_plaats, bv_categorie,  bv_beschrijving,
vb_benodigheden, vb_id,
COUNT(*) AS total_matches, GROUP_CONCAT(gc.matched_word) AS matched_words

FROM ( SELECT  bv_id, bv_functie, 'webdeveloper' AS matched_word FROM beheer_vacatures WHERE bv_functie LIKE '%webdeveloper%'
UNION ALL SELECT  bv_id,  bv_categorie, 'webdeveloper' AS matched_word FROM beheer_vacatures WHERE bv_categorie LIKE '%webdeveloper%'
UNION ALL SELECT  bv_id,  bv_plaats, 'helleb' AS matched_word FROM beheer_vacatures WHERE bv_plaats LIKE '%helleb%'

UNION ALL SELECT  bv_id,  bv_beschrijving, 'tsw1' AS matched_word FROM beheer_vacatures WHERE bv_beschrijving LIKE '%tsw1%'
UNION ALL SELECT  bv_id,  bv_beschrijving, 'kb1' AS matched_word FROM beheer_vacatures WHERE bv_beschrijving LIKE '%kb1%'

UNION ALL SELECT  bv_id, vb_benodigheden, 'tsw1' AS matched_word FROM vacature_benodigheden WHERE vb_benodigheden LIKE '%tsw1%'
UNION ALL SELECT  bv_id, vb_benodigheden, 'kb1' AS matched_word FROM vacature_benodigheden WHERE vb_benodigheden LIKE '%kb1%'
) AS gc

INNER JOIN beheer_vacatures  bv ON gc.bv_id =  bv.bv_id
LEFT JOIN  (SELECT bv_id, GROUP_CONCAT(vb_benodigheden) as vb_benodigheden, GROUP_CONCAT(vb_id) vb_id
    FROM vacature_benodigheden) vb
ON bv.bv_id = vb.bv_id  

GROUP BY bv.bv_id,bv_functie, bv_plaats,  bv_categorie,  bv_beschrijving ORDER BY total_matches DESC


Resultaat:

Afbeelding


Het zijn allebei tegengestelde resultaten:)
Gewijzigd op 27/02/2014 22:19:22 door Francoi gckx
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

28/02/2014 17:48:28
Quote Anchor link
>> Als ik nu geen left join doe kan ik vb_benodigheden en vb_id niet renderen.
Ik zei ook niet dat het zonder LEFT JOIN moet maar zonder de subquery in de LEFT JOIN.
Die kost je alleen maar performance.

Hetzelfde geldt overigens ook voor de GROUP_CONCAT functie.

Maar welk resultaat verwacht je nu?
 
Francoi gckx

Francoi gckx

05/03/2014 12:03:00
Quote Anchor link
Hoi Ger van Steenderen sorry voor de late reactie

Ik verwacht in iedergeval een juiste matching dat echt ook alles word gezocht op basis van de gegeven waardes

>> Als ik nu geen left join doe kan ik vb_benodigheden en vb_id niet renderen.

Alhoewel dat handig geweest was om te controleren of hij de woorden heeft opgenomen en niet dezelfde heeft gepakt (maar dan bedoel ik een herhalende zelfde waarde in dezelfde row/kolom).

Is dat niet echt nodig meer ik heb nu gewoon een tabel met: functie, plaats, aantal gematche woorde, de gematchede woorden en dat is wel goed zo.

Als ik toch vb_benodigheden en vb_id in de verwachte tabel wil dan hoe ik ook de query opbouw krijg ik of
teveel rows terug of ik krijg problemen met dat hij de verkeerde aantal geef etc etc.

Dus ik ben wel content hiermee de query is zo:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
SELECT bv.bv_id, bv.bv_functie, bv.bv_plaats, bv.bv_categorie, COUNT(*) AS total_matches, GROUP_CONCAT(DISTINCT gc.matched_word) AS matched_words
FROM ( SELECT bv_id, 'webdeveloper' AS matched_word FROM beheer_vacatures WHERE ((bv_functie LIKE '%webdeveloper%' AND 'webdeveloper' != ''))
UNION ALL SELECT bv_id, 'webdeveloper' AS matched_word FROM beheer_vacatures WHERE ((bv_categorie LIKE '%webdeveloper%' AND 'webdeveloper' != ''))
UNION ALL SELECT bv_id, 'helleb' AS matched_word FROM beheer_vacatures WHERE ((bv_plaats LIKE '%helleb%' AND 'helleb' != '')) UNION ALL SELECT bv_id, 'tsw1' AS matched_word FROM beheer_vacatures WHERE ((bv_beschrijving LIKE '%tsw1%' AND 'tsw1' != ''))

UNION ALL SELECT bv_id, 'kb1' AS matched_word FROM beheer_vacatures WHERE ((bv_beschrijving LIKE '%kb1%' AND 'kb1' != '')) UNION ALL SELECT bv_id, 'tsw1' AS matched_word FROM vacature_benodigheden WHERE ((vb_benodigheden LIKE '%tsw1%' AND 'tsw1' != ''))
UNION ALL SELECT bv_id, 'kb1' AS matched_word FROM vacature_benodigheden WHERE ((vb_benodigheden LIKE '%kb1%' AND 'kb1' != '')) ) AS gc

INNER JOIN beheer_vacatures AS bv ON gc.bv_id = bv.bv_id

LEFT JOIN (SELECT DISTINCT bv_id FROM vacature_benodigheden) vb ON gc.bv_id = vb.bv_id GROUP BY gc.bv_id, bv.bv_functie, bv.bv_plaats, bv.bv_categorie ORDER BY total_matches DESC
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.