SQL een->veel, verkeerde aantal in COUNT()

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Dennis WhoCares

Dennis WhoCares

04/07/2016 20:21:05
Quote Anchor link
Dag allemaal,

ik zie iets over het hoofd hier. Zoals al eerder ben ik pas begonnen met de JOIN queries in mysql.

Ik probeer een lijst van gebruikers te maken, daarbij behorende 'functies' en 'regio's die de gebruiker aangegeven heeft:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT p.prof_firstname,p.prof_id, COUNT(zr.zreg_regionid) as regions FROM saf_profiles p JOIN dns_users u ON p.prof_userid = u.user_id
JOIN saf_zregions zr ON zr.zreg_userid = u.user_id
JOIN saf_functions f ON f.func_userid = u.user_id
WHERE f.func_typeid LIKE "1" AND zr.zreg_regionid LIKE "2" AND u.user_level = 1 AND p.prof_visible = 1


De saf_regions tabel, bevat alleen: zreg_id(welke ik gewoon weg kan gooien, maar goed),zreg_userid,zreg_regionid

Nou werkt de query wel, alleen klopt het resultaat niet.
Ik heb 'like' in de query zitten, omdat het een van de vele combinaties kan/mag zijn.
Als zreg_regionid LIKE "%" is, krijg ik 6 resultaten op 'regions'
Dat klopt. Maar als ik nou een specifieke regionid kies, bijv 2 (welke user_id 1 ook heeft)
zijn de resultaten van 'regions' maar 2, ipv 6.

Ik snap er niks van :D
Gewijzigd op 04/07/2016 20:31:09 door Dennis WhoCares
 
PHP hulp

PHP hulp

16/11/2024 04:34:01
 
Ben van Velzen

Ben van Velzen

04/07/2016 20:46:27
Quote Anchor link
Ik mis eigenlijk een GROUP BY p.prof_firstname, p.prof_id in deze query. Group by is stapelt de gegevens op elkaar zodat je niet meer dan 1 unieke rij per user kan krijgen, en je COUNT dus ook totalen geeft ipv een gedeeltelijk totaal.
 
Dennis WhoCares

Dennis WhoCares

04/07/2016 20:51:38
Quote Anchor link
Ben van Velzen op 04/07/2016 20:46:27:
Ik mis eigenlijk een GROUP BY p.prof_firstname, p.prof_id in deze query. Group by is stapelt de gegevens op elkaar zodat je niet meer dan 1 unieke rij per user kan krijgen, en je COUNT dus ook totalen geeft ipv een gedeeltelijk totaal.



Ow sorry, ik gebruik ook GROUP BY p.prof_id

Er gaat nog meer fout. Als ik geen functie aangegeven heb, dus % laat, dan heeft deze userid 54 regio's.
De huidige gebruiker heeft, 9 functies, en 3 regio's.
Selecteer ik 1 funtie, en % als regio, dan is het resultaat, 6 regio's.
(Heb het verkeerd verwoord in het eerste bericht)

Ik heb nu GROUP BY p.prof_id, u.user_id maar resultaat is nog steeds 54 :-/
Laat ik nou functie % en kies ik een regio, dan is 'regions' 18

Heb het nou maar met een aparte querie gedaan, want die had ik toch al in m'n class ook op basis van userid, maar dan nog.. snap ik er weinig van
Gewijzigd op 04/07/2016 20:56:11 door Dennis WhoCares
 
Ben van Velzen

Ben van Velzen

04/07/2016 21:39:48
Quote Anchor link
>> Ow sorry, ik gebruik ook GROUP BY p.prof_id
En dat is in de genoemde query sowieso fout. De regels voor GROUP BY zijn heel eenvoudig: je noemt alle non-aggregrate (SUM, COUNT etc) velden.

Zonder verdere data is het niet echt duidelijk te krijgen wat de relatie is tussen de gewenste uitkomst en de data in de database.

Toevoeging op 04/07/2016 21:39:48:

>> Ow sorry, ik gebruik ook GROUP BY p.prof_id
En dat is in de genoemde query sowieso fout. De regels voor GROUP BY zijn heel eenvoudig: je noemt alle non-aggregrate (SUM, COUNT etc) velden.

Zonder verdere data is het niet echt duidelijk te krijgen wat de relatie is tussen de gewenste uitkomst en de data in de database.
 
Dennis WhoCares

Dennis WhoCares

04/07/2016 21:50:18
Quote Anchor link
Sorry Ben, ik dacht dat de geselecteerde velden duidelijk genoeg waren.
Ik probeer een profielenlijst te weergeven, op basis van gekozen functie en/of regio
Tabel functions bevat een job_id, en user_id
Tabel regios bevat een regio_id en user_id

de gebruikers kunnen dus meerdere functies en/of regio's bevatten.
Misschien is de LIKE wel overbodig, gebruikte t eigenlijk ook voor n ander veld genaamd driverlicense dat comma seperated rijbewijs type(s) kan bevatten.
Maar zelfs met dat eruit, de versimpelde query zie bovenaan, geeft ongewenste resultaten.
Wel 1 enkele record, voor mn test, maar abnormaal aantal regio's

Waarom is de group by profile id fout? Ik wil toch 1 resultaat per profiel?
De where kan ik misschien beter anders opbouwen aangezien regio id en functie id geen LIKE nodig heeft en/of helemaal niet gebruikt hoef te worden als ik zoek op 'alle'
 



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.