group_concat maar lege velden niet in de group_concat opnemen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Francoi gckx

Francoi gckx

03/02/2014 15:40:00
Quote Anchor link
Met behulp van een andere topic ben ik op een ander probleem tegengekomen met een anders soort database-tabel, zie ook: http://www.phphulp.nl/php/forum/topic/mysql-wil-1-record-ophalen-gelinkt-aan-andere-tables-maar-daar-zijn-ook-meerdere-records/93734/

Met een query en dmv GROUP_CONCAT krijg ik als resultaat in een rij: values/de id's|
Onder een voorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
KOLOM
tsw1/19|
tsw2/20|
tsw3/21|
/22|
/23|
/24|
/25|
/26...


Nu zit er lege waardes bij (vanaf 22) en die moet niet opgenomen worden in het betreffende kolom

Dit is de lijn waar ik nu op concentreer:
(GROUP_CONCAT(CONCAT(cvt.cvt_TS_wat, '/'), cvt.cvt_id ORDER BY cvt.cvt_id SEPARATOR '| ') AS cvt_TS_wat,

Query zelf:
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
SELECT
            bcv.bcv_id, bcv.bcv_laatste_functie, bcv.bcv_beschrijving,
GROUP_CONCAT(CONCAT(cvt.cvt_TS_wat, '/'), cvt.cvt_id ORDER BY cvt.cvt_id SEPARATOR '| ') AS cvt_TS_wat,
GROUP_CONCAT(DISTINCT CONCAT(cvt.cvt_TS_hoelang, '/'), cvt.cvt_id ORDER BY cvt.cvt_id SEPARATOR '| ') AS cvt_TS_hoelang,
GROUP_CONCAT(DISTINCT CONCAT(cvt.cvt_technisch_know_how , '/'), cvt.cvt_id ORDER BY cvt.cvt_id SEPARATOR '| ') AS cvt_technisch_know_how ,
cvs.cvs_S_wat, cvs.cvs_S_hoelang, cvs.cvs_scholing, cvw.cvw_WE_wat, cvw.cvw_WE_hoelang, cvw.cvw_WE_inzet, cvw.cvw_WE_bedrijf, cvw.cvw_werkervaring, ba_id, bcv.bcv_datum, bcv.bcv_foto FROM beheer_cv bcv
            INNER JOIN cv_techskills cvt
            ON cvt.bcv_id = bcv.bcv_id
            INNER JOIN cv_scholing cvs
            ON
            cvs.bcv_id = bcv.bcv_id
            INNER JOIN cv_werkervaring cvw
            ON
            cvw.bcv_id = bcv.bcv_id
            WHERE ba_id= 5
 
PHP hulp

PHP hulp

21/12/2024 12:37:08
 

03/02/2014 16:09:47
Quote Anchor link
Wat is nu precies je vraag? Ik zie nergens enige vorm van een vraag staan.
 
Francoi gckx

Francoi gckx

03/02/2014 16:13:10
Quote Anchor link
Nu zit er lege waardes bij (vanaf 22) en die moet niet opgenomen worden in het betreffende kolom
-> Is er een filter binnen in de GROUP_CONCAT die de lege waardes niet opneemt en ipv de voorbeeld boven de kolom er zo uit laat komen te zien?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
KOLOM
tsw1/19|
tsw2/20|
tsw3/21|
Gewijzigd op 03/02/2014 16:13:30 door Francoi gckx
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

03/02/2014 18:07:18
Quote Anchor link
Nee niet in de group_concat, maar met in het achterhoofd dat het grouperen pas als laatste gebeurd kan je die waardes in de where er al uit filteren:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
.......
WHERE ba_id = 5 AND cvt.cvt_TS_hoelang IS NOT NULL
 
Francoi gckx

Francoi gckx

03/02/2014 19:10:29
Quote Anchor link
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
SELECT
            bcv.bcv_id, bcv.bcv_laatste_functie, bcv.bcv_beschrijving,
GROUP_CONCAT(CONCAT(cvt.cvt_TS_wat, '/'), cvt.cvt_id ORDER BY cvt.cvt_id SEPARATOR '| ') AS cvt_TS_wat,
GROUP_CONCAT(DISTINCT CONCAT(cvt.cvt_TS_hoelang, '/'), cvt.cvt_id ORDER BY cvt.cvt_id SEPARATOR '| ') AS cvt_TS_hoelang,
GROUP_CONCAT(DISTINCT CONCAT(cvt.cvt_technisch_know_how , '/'), cvt.cvt_id ORDER BY cvt.cvt_id SEPARATOR '| ') AS cvt_technisch_know_how ,
cvs.cvs_S_wat, cvs.cvs_S_hoelang, cvs.cvs_scholing, cvw.cvw_WE_wat, cvw.cvw_WE_hoelang, cvw.cvw_WE_inzet, cvw.cvw_WE_bedrijf, cvw.cvw_werkervaring, ba_id, bcv.bcv_datum, bcv.bcv_foto FROM beheer_cv bcv
            INNER JOIN cv_techskills cvt
            ON cvt.bcv_id = bcv.bcv_id
            INNER JOIN cv_scholing cvs
            ON
            cvs.bcv_id = bcv.bcv_id
            INNER JOIN cv_werkervaring cvw
            ON
            cvw.bcv_id = bcv.bcv_id
            WHERE ba_id= 5
 AND cvt.cvt_TS_wat IS NOT NULL
            GROUP BY cvt.cvt_TS_wat


Ik krijg dit, in kolom cvt_TS_wat:

rij1 = /22| /23| /24| /25| /26| /27
rij2 = tsw1/19
rij3 = tsw2/20
rij4 = tsw3/21

En als ik de query zo uitvoer:

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
SELECT
            bcv.bcv_id, bcv.bcv_laatste_functie, bcv.bcv_beschrijving,
            GROUP_CONCAT(CONCAT(if(cvt.cvt_TS_wat = '', null, cvt.cvt_TS_wat ), '/'), cvt.cvt_id ORDER BY cvt.cvt_id SEPARATOR '| ') AS cvt_TS_wat,
            GROUP_CONCAT(DISTINCT CONCAT(cvt.cvt_TS_hoelang, '/'), cvt.cvt_id ORDER BY cvt.cvt_id SEPARATOR '| ') AS cvt_TS_hoelang,
            GROUP_CONCAT(DISTINCT CONCAT(cvt.cvt_technisch_know_how , '/'), cvt.cvt_id ORDER BY cvt.cvt_id SEPARATOR '| ') AS cvt_technisch_know_how ,
            cvs.cvs_S_wat, cvs.cvs_S_hoelang, cvs.cvs_scholing, cvw.cvw_WE_wat, cvw.cvw_WE_hoelang, cvw.cvw_WE_inzet, cvw.cvw_WE_bedrijf, cvw.cvw_werkervaring, ba_id, bcv.bcv_datum, bcv.bcv_foto FROM beheer_cv bcv
            INNER JOIN cv_techskills cvt
            ON cvt.bcv_id = bcv.bcv_id
            INNER JOIN cv_scholing cvs
            ON
            cvs.bcv_id = bcv.bcv_id
            INNER JOIN cv_werkervaring cvw
            ON
            cvw.bcv_id = bcv.bcv_id
            WHERE ba_id= ? AND cvt.cvt_TS_wat IS NOT NULL
            GROUP BY cvt.cvt_TS_wat

GROUP_CONCAT(CONCAT(if(cvt.cvt_TS_wat = '', null, cvt.cvt_TS_wat ), '/'), cvt.cvt_id ORDER BY cvt.cvt_id SEPARATOR '| ') AS cvt_TS_wat

in kolom cvt_TS_wat:
rij1 = NULL
rij2 = tsw1/19
rij3 = tsw2/20
rij4 = tsw3/21
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

03/02/2014 19:22:28
Quote Anchor link
Dan staat er denk ik toch iets in die kolom, een spatie misschien.

Daarnaast klopt je group_by niet, daar horen alle niet aggegrate kolommen uit de select list te staan, en jij zet er juist één in die er niet in voorkomt.
Dit zou eigenlijk gewoon een foutmelding moeten geven, bij de meeste databse systemen krijg je die ook, maar in mySQL niet (tenzij je FULL_GROUP_BY instelt op 1)
Gewijzigd op 03/02/2014 19:28:36 door Ger van Steenderen
 
Francoi gckx

Francoi gckx

03/02/2014 19:32:19
Quote Anchor link
Nee niks het komt wel van een array af bij het inserten maar dat levert geen spaties op

De totale tabel ziet er zo uit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
cvt_id     bcv_id     cvt_technisch_know_how     cvt_TS_wat     cvt_TS_hoelang
19     12         tsw1     
20     12         tsw2     
21     12         tsw3     
22     12             tsw1
23     12             tsw2
24     12             tsw3
25     12     kb1        
26     12     kb2        
27     12     kb3        


GROUP BY cvt.cvt_TS_wat moet zeker GROUP BY cvt_TS_wat zijn ?


Toevoeging op 03/02/2014 19:33:15:

Ik hoop dat iemand het duidelijk kan zien maar is er geen beter manier om een tabel te tonen op phphulp en dan niet met printscreen?

Toevoeging op 03/02/2014 19:38:46:

O sorry Ger niet goed gelezen ik dacht juist wel alle aggegrate kolommen en dan bedoel je zeker bcv.bcv_id, bcv.bcv_laatste_functie, bcv.bcv_beschrijving, enzo even zien of dat het probleem zelf oplost
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

03/02/2014 19:44:46
Quote Anchor link
In de group by hoort ELKE kolom te staan die in je SELECT voorkomt, met uitzondering van de kolommen die in een aggegrate functie staan, dus in jouw geval alles buiten de group_concat.

Als je in mysql insert met waarde '', is dat een lege string maar geen NULL.
Verander WHERE ba_id= ? AND cvt.cvt_TS_wat IS NOT NULL in:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
WHERE ba_id= ? AND cvt.cvt_TS_wat <> ''
 
Francoi gckx

Francoi gckx

03/02/2014 20:07:42
Quote Anchor link
Oh juist... dat heeft waarschijnlijk gewerkt (ik zeg altijd waarschijnlijk want vaak als ik weer verder ben blijkt het dan toch niet zo te zijn;))

Maar Ger ik heb nu GROUP BY gewoon op de foute kolom GROUP BY cvt.cvt_TS_wat laten staan,
maar in output bij phpmyadmin zie ik geen verschil of foutmelding hoe je het ook noemen wilt..

Waarom is het zo belangrijk om GROUP BY te gebruiken op alles behalve de aggegrate kolommen terwijl het nu zonder ook werkt?
Tweede vraag: Hoor je GROUP BY dan te gebruiken wanneer er juist aggegrate kolommen er bij komen kijken?

Bedankt en fijne avond toegewenst!
Gewijzigd op 03/02/2014 20:09:11 door Francoi gckx
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

03/02/2014 20:42:22
Quote Anchor link
>> Waarom is het zo belangrijk om GROUP BY te gebruiken op alles behalve de aggegrate kolommen terwijl het nu zonder ook werkt?

1) Omdat je anders onverwachte resultaten kan krijgen.
2) Als de databasebeheerder de systeem variabele FULL_GROUP_BY op 1 heeft gezet krijg je een foutmelding.

>>Tweede vraag: Hoor je GROUP BY dan te gebruiken wanneer er juist aggegrate kolommen er bij komen kijken?

Ja, omdat anders de GROUP BY zinloos is. Je ziet wel vaker voorbeelden voorbij komen waarbij een GROUP BY wordt gebruikt om DISTINCT values te verkrijgen (dus zonder agg functies), maar je kan dan veel beter SELECT DISTINCT gebruiken.
Het waarom is heel simpel:
SELECT DISTINCT slaat alle rows over die al eens geselecteerd zijn, terwijl bij group by eerst alle rows geselecteerd worden en dan pas gegroepeerd
 
Francoi gckx

Francoi gckx

03/02/2014 21:36:32
Quote Anchor link
Het wordt toch ingewikkelder als ik nu ook de andere probeer te doen op dezelfde manier krijgt hij geen resultaat meer.

Hij gooit nu alle id's eruit en sql houdt niks meer over

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
SELECT
            bcv.bcv_id, bcv.bcv_laatste_functie, bcv.bcv_beschrijving,
            GROUP_CONCAT(CONCAT(cvt.cvt_TS_wat, '/'), cvt.cvt_id ORDER BY cvt.cvt_id SEPARATOR '| ') AS cvt_TS_wat,
            GROUP_CONCAT(CONCAT(cvt.cvt_TS_hoelang, '/'), cvt.cvt_id ORDER BY cvt.cvt_id SEPARATOR '| ') AS cvt_TS_hoelang,
            GROUP_CONCAT(CONCAT(cvt.cvt_technisch_know_how , '/'), cvt.cvt_id ORDER BY cvt.cvt_id SEPARATOR '| ') AS cvt_technisch_know_how ,
            cvs.cvs_S_wat, cvs.cvs_S_hoelang, cvs.cvs_scholing, cvw.cvw_WE_wat, cvw.cvw_WE_hoelang, cvw.cvw_WE_inzet, cvw.cvw_WE_bedrijf, cvw.cvw_werkervaring, ba_id, bcv.bcv_datum, bcv.bcv_foto FROM beheer_cv bcv
            INNER JOIN cv_techskills cvt
            ON cvt.bcv_id = bcv.bcv_id
            INNER JOIN cv_scholing cvs
            ON
            cvs.bcv_id = bcv.bcv_id
            INNER JOIN cv_werkervaring cvw
            ON
            cvw.bcv_id = bcv.bcv_id
            WHERE ba_id= 5 AND cvt.cvt_TS_wat <> ''
            AND cvt.cvt_TS_hoelang <> '' AND cvt.cvt_technisch_know_how <> ''
            GROUP BY bcv.bcv_id, bcv.bcv_laatste_functie, bcv.bcv_beschrijving, cvs.cvs_S_wat, cvs.cvs_S_hoelang, cvs.cvs_scholing, cvw.cvw_WE_wat, cvw.cvw_WE_hoelang, cvw.cvw_WE_inzet, cvw.cvw_WE_bedrijf, cvw.cvw_werkervaring, ba_id, bcv.bcv_datum, bcv.bcv_foto
 



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.