Toon posts:

[PHP/MYSQL] Join probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo. Ik heb een probleem met het maken van een goede SELECT opdracht met gebruik van joins.

De site die ik beheer is gecombineerd met het phpBB forum en de gebruikersgroepen van phpBB zijn tevens de gebruikersgroepen van de site zelf. Om de gebruikersrechten uit de phpBB database te halen moet je via de userid van de USER table de verschillende groepen uit de USER_GROUP table halen. Vervolens wordt er aan de hand van deze GROUPS, de group_id, de overige gegevens(rechten) uit de GROUP table gehaald. Nu morgen er uit de GROUP database alleen maar usergroupen gehaald worden waarbij group_single_user niet 1 is, dit zijn de usergroupen met een speciale status(rechten). Elke gebruiker in phpBB heeft namelijk een eigen gebruikersgroup. Nu is het zo dat als iemand geen speciale rechten heeft de gebruikersinformatie gewoon uit de database gehaald moet worden, en dat de rechten pas uit de andere tabellen gejoind moeten worden zodra iemand deze heeft(anders dus alleen de gebruikersinformatie). Nu dacht ik dat met de volgende SELECT te doen, maar spijtig genoeg werkt het niet en krijg ik geen resultaten.

De code is als volgt:

PHP:
4
5
6
7
8
9
$result = $db->query("SELECT a.username, a.user_password, a.user_style, ug.group_id, g.* 
            FROM " . USERS_TABLE . " AS a 
            LEFT JOIN " . USER_GROUP_TABLE . " AS ug ON a.user_id = ug.user_id  
            LEFT JOIN " . GROUPS_TABLE . " AS g ON g.group_id = ug.group_id 
            WHERE g.group_single_user !='1'
            AND a.user_id = '$group_id[userid]'");


Ik hoop dat ik duidelijk ben, anders wil ik nog best het een en ander toelichten. :) Alvast bedankt.

Verwijderd

kan me vergissen maar moet USERS_TABLE niet $USERS_TABLE zijn? (zelfde geldt voor overige drie)

or die(mysql_error()); achter je query zetten wil ook wel eens helpen het probleem te pin-pointen

Verwijderd

Topicstarter
Nee, USER_TABLE is een constant. Het is dan ook geen syntaxfout maar met de fout in de semantiek. Dat is dan ook meteen een reply op je 2de opmerking, want er wordt geen error weergegeven. Als dit wel zo zou zijn zou dit automatisch weergegeven worden omdat deze SELECT via een database class wordt afgehandeld, die ook automatisch error's laat zien.

Verwijderd

Ah IC
heb je shell toegang?
zorg dan ff dat de query geechood (lekker woord) wordt en paste die in je shell en ga er dan een beetje mee sleutelen. Dat doe ik altijd als m'n query geen resultaat oplevert.
Dan kun je even kijken wat een select op de 3 verschillende tabellen apart oplevert

Die quotes om getallen hoeft trouwens niet (in je where clausule)

Verwijderd

Topicstarter
Shell toegang.. Niet dat ik weet eigenlijk. :(

En inderdaad, die '' hoeven niet. :)

Verwijderd

installeer anders ff iets als MySQLFront of PHPMyAdmin...heb je ook een soort shell
(vind mysqlfront persoonlijk een stuk prettiger werken, alleen is dat niet mogelijk als mysql voor toegang van buiten is afgeschermd - dan zul je phpmyadmin moeten gebruiken)

Verwijderd

Topicstarter
Ik heb, voor de zoveelste keer, lopen sleutelen met mijn query.. Zonder resultaat.. Iemand anders die uitkomst kan bieden?

In ieder geval bedankt voor je tip linux-newbie. :)

Verwijderd

Topicstarter
Ik geloof dat ik de oplossing, na dagen zoeken :/, eindelijk gevonden heb. Althans. Met behulp van de shell is het me gelukt om de goede resultaten uit de database te halen. Bedankt!

Ow, toch de goede code er maar bijzetten:

PHP:
4
5
6
7
8
9
$result = $db->query("SELECT a.username, a.user_password, a.user_style, ug.group_id, g.* 
            FROM " . USERS_TABLE . " AS a 
            LEFT JOIN " . USER_GROUP_TABLE . " AS ug ON a.user_id = ug.user_id  
            LEFT JOIN " . GROUPS_TABLE . " AS g ON g.group_id = ug.group_id 
            AND  g.group_single_user !='1'
            WHERE a.user_id = '$group_id[userid]'");


De eerste where in AND en de 2de AND in WHERE veranderen deed wonderen. :)
Pagina: 1