Hallo, ik zit met een LEFT JOIN probleem waar ik op dit moment nog geen raad mee heb. Onderstaand de tabel structuren. Een user kan extra rechten op een forum hebben via een groep. een user kan lid zijn van meerdere groepen. Een groep kan rechten hebben gedefineerd op 1 of meer forums. De bedoeling van de query:
- haal alle categorieen en forums op
- geef de standaard rechten op elk forum
- geef de overrulende rechten indien die bestaan
- sorteer op categorie en op forum dmv een Order veld
Ik heb dus 2 queryies gemaakt.
- 1 als de user niet ingelogd is. deze werkt goed omdat deze geen extra rechten kent
- 1 waarbij de user ingelogd is, waarbij de mogelijke extra rechten in de query verwerkt moeten worden.
het probleem:
zodra ik defineer dat UserID = bijvoorbeeld 1, dan geeft ie alleen de rijen weer waarbij UserID gedefineerd is, namelijk 1 is. Hierbij verlies ik dus de rijen waarbij de user geen extra rechten heeft, omdat de groep(en) waarvan hij lid is op dat forum geen rechten heeft gedefineerd.
In ieder geval heb ik meerdere soorten joins geprobeerd zoals LEFT JOIN en in bovenstaand voorbeeld staat ook LEFT OUTER JOIN erin. Is het dus mogelijk om ook de rijen waarin User_ID niet "bestaat" of NULL is op te vragen. Ik heb het al geprobeerd met tau.User_ID = 1 OR tau.User_ID = NULL maar dat werkt niet. Ook ISNULL(User_ID) werkt niet Voor diegene die mij kunnen helpen alvast bedankt
- haal alle categorieen en forums op
- geef de standaard rechten op elk forum
- geef de overrulende rechten indien die bestaan
- sorteer op categorie en op forum dmv een Order veld
Ik heb dus 2 queryies gemaakt.
- 1 als de user niet ingelogd is. deze werkt goed omdat deze geen extra rechten kent
- 1 waarbij de user ingelogd is, waarbij de mogelijke extra rechten in de query verwerkt moeten worden.
het probleem:
zodra ik defineer dat UserID = bijvoorbeeld 1, dan geeft ie alleen de rijen weer waarbij UserID gedefineerd is, namelijk 1 is. Hierbij verlies ik dus de rijen waarbij de user geen extra rechten heeft, omdat de groep(en) waarvan hij lid is op dat forum geen rechten heeft gedefineerd.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| CREATE TABLE `top_categories` ( `Cat_ID` tinyint(3) unsigned NOT NULL auto_increment, `Cat_Title` varchar(60) default '0', `Cat_Order` tinyint(3) default '0', `Cat_Moderators` mediumtext, PRIMARY KEY (`Cat_ID`), KEY `Cat_Order` (`Cat_Order`) ) TYPE=MyISAM; CREATE TABLE `top_forums` ( `Forum_ID` tinyint(3) NOT NULL auto_increment, `Cat_ID` tinyint(3) default '0', `Forum_Name` varchar(60) default '0', `Forum_Desc` mediumtext, `Forum_Status` tinyint(3) default '0', `Forum_Order` tinyint(3) default '0', `Forum_Posts` int(10) unsigned default '0', `Forum_Topics` int(10) unsigned default '0', `Forum_Moderators` mediumtext, `auth_view` tinyint(1) unsigned default '0', `auth_read` tinyint(1) unsigned default '0', `auth_post` tinyint(1) unsigned default '0', `auth_reply` tinyint(1) unsigned default '0', `auth_edit` tinyint(1) unsigned default '0', `auth_delete` tinyint(1) unsigned default '0', PRIMARY KEY (`Forum_ID`), KEY `Cat_ID` (`Cat_ID`,`Forum_Order`) ) TYPE=MyISAM; CREATE TABLE `top_group_auth` ( `User_ID` int(10) default '0', `Group_ID` int(3) default '0', KEY `User_ID` (`User_ID`,`Group_ID`) ) TYPE=MyISAM; CREATE TABLE `top_groups` ( `Group_ID` tinyint(3) unsigned NOT NULL auto_increment, `Group_Name` varchar(60) default NULL, `Group_Desc` mediumtext, PRIMARY KEY (`Group_ID`) ) TYPE=MyISAM; |
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| SELECT
c.Cat_ID,
c.Cat_Order,
f.Forum_ID,
f.Forum_Order,
c.Cat_Title,
c.Cat_Moderators,
f.Forum_Name,
f.Forum_Desc,
f.Forum_Posts,
f.Forum_Topics,
f.Forum_Moderators,
f.auth_view,
MAX(tga.auth_view) AS uauth_view,
MAX(tga.auth_read) AS uauth_read,
MAX(tga.auth_post) AS uauth_post,
MAX(tga.auth_reply) AS uauth_reply,
MAX(tga.auth_edit) AS uauth_edit,
MAX(tga.auth_delete) AS uauth_delete,
MAX(tga.mod_edit) AS umod_edit,
MAX(tga.mod_delete) AS umod_delete,
MAX(tga.mod_closetopic)AS umod_closetopic,
MAX(tga.ban_user) AS uban_user
FROM top_categories c
LEFT JOIN top_forums f ON c.Cat_ID = f.Cat_ID
LEFT OUTER JOIN top_groups_acces tga ON f.Forum_ID = tga.Forum_ID
LEFT JOIN top_group_auth tau ON tau.Group_ID = tga.Group_ID
WHERE
tau.User_ID = 1
GROUP BY tga.Forum_ID
ORDER BY c.Cat_Order, f.Forum_Order ASC |
In ieder geval heb ik meerdere soorten joins geprobeerd zoals LEFT JOIN en in bovenstaand voorbeeld staat ook LEFT OUTER JOIN erin. Is het dus mogelijk om ook de rijen waarin User_ID niet "bestaat" of NULL is op te vragen. Ik heb het al geprobeerd met tau.User_ID = 1 OR tau.User_ID = NULL maar dat werkt niet. Ook ISNULL(User_ID) werkt niet Voor diegene die mij kunnen helpen alvast bedankt