SQL een->veel, verkeerde aantal in COUNT()
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)
1
2
3
4
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
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
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.
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
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.
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'