[MySQL][SQL] LEFT JOIN

Pagina: 1
Acties:

  • smaij
  • Registratie: November 2000
  • Laatst online: 00:20
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.

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 _/-\o_

  • robjanssen
  • Registratie: September 2001
  • Laatst online: 02-08 16:10

robjanssen

Software Developer

code:
1
tau.User_ID = 1 OR tau.User_ID IS NULL

  • smaij
  • Registratie: November 2000
  • Laatst online: 00:20
robjanssen schreef op 18 oktober 2002 @ 00:16:
code:
1
tau.User_ID = 1 OR tau.User_ID IS NULL
nopes werkt niet. :'(

het feit is gewoon dat er geen waarde is, ook geen NULL waarde. Dus als ik selecteer op een UserID kan ik daarna niet meer zeggen OR UserID = NULL. :'(

misschien iemand anders een idee :>

[ Voor 0% gewijzigd door smaij op 18-10-2002 00:36 . Reden: toevoeging ]


Verwijderd

mischien
tau.User_ID = 0 OR tau.User_ID = ''

waarschijnlijk zijn het lege trings ipv NULL's

  • smaij
  • Registratie: November 2000
  • Laatst online: 00:20
Verwijderd schreef op 18 oktober 2002 @ 07:22:
mischien
tau.User_ID = 0 OR tau.User_ID = ''

waarschijnlijk zijn het lege trings ipv NULL's
nopes :'(

Verwijderd

ISNULL()

Verwijderd

Defaults staan op '0', moet je daar dan niet op checken (tau.user_id=[xxx] or tau.user_id=0) ???

  • smaij
  • Registratie: November 2000
  • Laatst online: 00:20
Verwijderd schreef op 18 oktober 2002 @ 10:29:
Defaults staan op '0', moet je daar dan niet op checken (tau.user_id=[xxx] or tau.user_id=0) ???
Hoe bedoel je checken op 0. Dit heb ik geprobeerd, maar returned in alle gevallen gewoon geen enkele rij.

omdat er naast die join dus rijen ontstaan waarbij UserID 'leeg' is, of niet 'bestaat', is 0 logischerwijs dus geen oplossing. Tuurlijk was dat mijn eerste gedachte ook maar het blijkt dus niet zo te zijn.

als ik in de WHERE condititie neerzet:

WHERE User_ID = 1 : dan krijg ik netjes de forums waarbij user 1 meer rechten gedefineerd is, maar niet de rest van de forums, die ik er wel in zou willen hebben

WHERE User_ID = 0 : geen rijen
WHERE User_ID = 1 OR User_ID = 0 : zelfde resultaat als alleen User_ID = 1
WHERE ISNULL(User_ID) : geen rijen
WHERE User_ID = 1 OR ISNULL(User_ID) : zelfde resultaat als alleen User_ID = 1

UserID 4 bestaat ook maar is van geen enkele groep lid, dus heeft geen extra rechten op 1 of meerdere forums. Als ik dit logischerwijs uitvoer op bovenstaande WHERE condities, dan returned deze actie over geen rijen.
Iemand :|

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Als ik het goed begrijp dan wil je van User_ID = 1 weten welke rechten hij heeft op welk forum? Zo ja, dan vraag ik me af waarom je een LEFT JOIN hebt op top_forums.
Tussen haakjes (LEFT JOIN is hetzelfde als LEFT OUTER JOIN).
Goed, om verder op je probleem in te gaan: je doet een GROUP BY op tga.Forum_ID. Ik denk dat daar het probleem zit. Ten eerste groepeer je dan op iets wat NULL kan zijn, dus als die LEFT JOIN op top_forums niet nodig is, dan zou je eens kunnen beginnen door de groeperen op f.Forum_ID.
Verder zou je je laatste LEFT JOIN kunnen verbouwen tot de volgende constructie:
code:
1
LEFT JOIN top_group_auth tau ON (tau.Group_ID = tga.Group_ID AND tau.User_ID = 1)

Door de filter op User_ID in de LEFT JOIN te plaatsen, hoef je er geen rekening meer mee te houden, dat User_ID ook NULL kan zijn. Dat doet ie dan automatisch.

Never underestimate the power of


Verwijderd

Ik mis de tabel defs van top_groups_access...

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Verwijderd schreef op 18 oktober 2002 @ 10:46:
Ik mis de tabel defs van top_groups_access...
Die is waarschijnlijk niet belangrijk genoeg. :)

Never underestimate the power of


  • smaij
  • Registratie: November 2000
  • Laatst online: 00:20
cameodski schreef op 18 oktober 2002 @ 10:47:
[...]

Die is waarschijnlijk niet belangrijk genoeg. :)
Toch wel.. maar was gisteravond al erg laat..

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE `top_groups_acces` (
  `Group_ID` int(3) default '0',
  `Forum_ID` mediumint(10) default '0',
  `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',
  `mod_edit` tinyint(1) unsigned default '0',
  `mod_delete` tinyint(1) unsigned default '0',
  `mod_closetopic` tinyint(1) unsigned default '0',
  `ban_user` tinyint(1) unsigned default '0',
  KEY `Group_ID` (`Group_ID`,`Forum_ID`)
) TYPE=MyISAM;
cameodski schreef op 18 oktober 2002 @ 10:40:
Als ik het goed begrijp dan wil je van User_ID = 1 weten welke rechten hij heeft op welk forum? Zo ja, dan vraag ik me af waarom je een LEFT JOIN hebt op top_forums.
Tussen haakjes (LEFT JOIN is hetzelfde als LEFT OUTER JOIN).
Goed, om verder op je probleem in te gaan: je doet een GROUP BY op tga.Forum_ID. Ik denk dat daar het probleem zit. Ten eerste groepeer je dan op iets wat NULL kan zijn, dus als die LEFT JOIN op top_forums niet nodig is, dan zou je eens kunnen beginnen door de groeperen op f.Forum_ID.
Verder zou je je laatste LEFT JOIN kunnen verbouwen tot de volgende constructie:
code:
1
LEFT JOIN top_group_auth tau ON (tau.Group_ID = tga.Group_ID AND tau.User_ID = 1)

Door de filter op User_ID in de LEFT JOIN te plaatsen, hoef je er geen rekening meer mee te houden, dat User_ID ook NULL kan zijn. Dat doet ie dan automatisch.
Ik groepeer op ForumID die in een LEFT JOIN zit, om zo ook de categorien te pakken waar nog geen Forum in zit.. In principe had dit niet gehoeven nee.

Daarnaast wil ik onderstaand voorbeeld niet helemaal. Namelijk ik wil alle forums die aanwezig zijn terugvangen, en nu zou ik dan alleen de forums krijgen waarbij extra rechten zijn gedefineerd, of wacht.. zal is kijken of het werkt, want dit gebeurd natuurlijk voordat WHERE word aangeroepen.
code:
1
LEFT JOIN top_group_auth tau ON (tau.Group_ID = tga.Group_ID AND tau.User_ID = 1)


ik zal is sjecken ;)

[ Voor 0% gewijzigd door smaij op 18-10-2002 11:03 . Reden: toevoeging ]


  • smaij
  • Registratie: November 2000
  • Laatst online: 00:20
Hierbij een klein gifje waarin de structuur zoals ik bedacht had staat

Afbeeldingslocatie: http://ret1.leaseweb.nl/forum.GIF

sorry dat het er nogal slordig uitziet..

User4 is dus van geen enkele groep lid, maar zou toch elk forum te zien moeten krijgen.

User 1, 2 en 3 zijn lid van 1 of meer groepen, die groepen bevatten rechten op 1 of meer forums (mogen zelfs dezelfde forums zijn, hij pakt de grootste waarde dmv MAX) Deze moeten dus naast die forums waarop ze extra rechten hebben dus ook de forums te zien krijgen waar de standaard rechten op gelden.

het voorbeeld van cameodoski werkt niet. Nu is het namelijk zo dat het niet eens uitmaakt welk UserID ik invul, hij geeft altijd de gedefineerd extra rechten terug. :'( Het zag er wel uit alsof het ging werken maar toch niet :S

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
smaij schreef op 18 oktober 2002 @ 11:20:
het voorbeeld van cameodoski werkt niet. Nu is het namelijk zo dat het niet eens uitmaakt welk UserID ik invul, hij geeft altijd de gedefineerd extra rechten terug. :'( Het zag er wel uit alsof het ging werken maar toch niet :S
Je bedoelt dat je alleen records uit de tabel top_groups_acces wilt zien als de user daar ook rechten op heeft?

Never underestimate the power of


  • smaij
  • Registratie: November 2000
  • Laatst online: 00:20
Aan de hand van het plaatje:

de query moet:

- alle forums selecteren in volgorde van CategorieOrder en ForumOrder
- aan de hand van de groepen waarop de user rechten heeft de hoogste rechten van dat forum selecteren indien er rechten op dat forum zijn gedefineerd. dus zoals de laaste post van cameodski
Je bedoelt dat je alleen records uit de tabel top_groups_acces wilt zien als de user daar ook rechten op heeft?
aangezien een user rechten kan hebben op meerdere forums kan een forum dus meer keer voorkomen in de resultaten en dit groepeer ik dus door GROUP BY Forum_ID

In PHP sjeck ik of ik de originele rechten van het forum moet gebruiken of de overrulende rechten van top_groups_acces

Verwijderd

Kon het niet laten om uit te proberen...

Ik heb een query gemaakt die de users met bijhorende rechten selecteerd die ik vervolgens "GA" noem

SELECT TGA.FORUM_ID, 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, TAU.USER_ID
FROM TOP_GROUPS_ACCESS AS TGA LEFT JOIN TOP_GROUP_AUTH AS TAU ON TGA.GROUP_ID = TAU.GROUP_ID
GROUP BY TGA.FORUM_ID, TAU.USER_ID;

Vervolgens selecteer ik (even de verkorte versie met alleen UAUTH_VIEW) de forums met de query gekoppeld en check op userID 1 of isnull

SELECT DISTINCT C.CAT_ID, C.CAT_TITLE, F.FORUM_ID, F.FORUM_NAME, IIf([UAUTH_VIEW] Is Null,[F.AUTH_VIEW],[UAuth_View]) AS [VIEW], GA.USER_ID
FROM (TOP_CATEGORIES AS C LEFT JOIN TOP_FORUMS AS F ON C.CAT_ID = F.CAT_ID) LEFT JOIN GA ON F.FORUM_ID = GA.FORUM_ID
WHERE (((GA.USER_ID)=1 Or (GA.USER_ID) Is Null));


Met een IIF wordt gekeken of de gebruiker rechten heeft of niet (de is null weer), zo niet, dan worden de rechten uit de forumtabel zef gehaald.


Heb 5 forums, gebruiker 1 heeft extra rechten in forum 1 en 2, krijg dan gewoon alle 5 de forums met de standaard rechten voor forums 3, 4 en 5 en aangepaste rechten voor forums 1 en 2.

Volgens mij moet je zoiets hebben dus...???

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
N0stradamusNL zou je de volgende keer misschien code-tags willen gebruiken en een beetje opmaak willen toepassen. Dan is het tenminste nog een beetje leesbaar.
In MySQL zijn geen subqueries mogelijk en wat je hier doet, is in feite toch gebruik maken van subqueries. Ik vrees dan ook dat het niet gaat werken.

Never underestimate the power of


  • smaij
  • Registratie: November 2000
  • Laatst online: 00:20
ik heb effe alles netjes neergezet
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
#Ik heb een query gemaakt die de users met bijhorende rechten selecteerd die ik vervolgens "GA" noem

    SELECT
     TGA.FORUM_ID,
     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,
     TAU.USER_ID
  FROM TOP_GROUPS_ACCESS AS TGA LEFT JOIN TOP_GROUP_AUTH AS TAU ON TGA.GROUP_ID = TAU.GROUP_ID
  GROUP BY TGA.FORUM_ID, TAU.USER_ID;


#Vervolgens selecteer ik (even de verkorte versie met alleen UAUTH_VIEW) de forums met de query gekoppeld en check op userID 1 of isnull

 SELECT DISTINCT 
  C.CAT_ID,
    C.CAT_TITLE, 
    F.FORUM_ID, 
    F.FORUM_NAME, 
    IIf([UAUTH_VIEW] Is Null,[F.AUTH_VIEW],[UAuth_View]) AS [VIEW], 
    GA.USER_ID
 FROM (TOP_CATEGORIES AS C 
    LEFT JOIN TOP_FORUMS AS F ON C.CAT_ID = F.CAT_ID) 
    LEFT JOIN GA ON F.FORUM_ID = GA.FORUM_ID
 WHERE (((GA.USER_ID)=1 Or (GA.USER_ID) Is Null));


en *snik* alles gelezen, en ik kan niet met subqueries werken in MySQL. Anders had ik allang de oplossing gehad, omdat je dan gewoon kijkt welke aanwezig zijn in "GA" (in jouw verhaal) en de overige forums daar dan weer uithaalt.

Verwijderd

Sorry van de opmaak...

Ook geen VIEWS beschikbaar?

edit:

Excuses toegevoegd

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Toch denk ik dat het moet kunnen. Ik zie alleen de oplossing nog effe niet.
Hoe haal je trouwens de standaard rechten op? Is er een standaard groep met standaard rechten of werkt dat anders?

Never underestimate the power of


  • smaij
  • Registratie: November 2000
  • Laatst online: 00:20
De standaard rechten staan in de tabel van de forums zelf.
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;

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
OK, doordat je groepeert op forum_id maakt het niet uit dat je alle rechten terugkrijgt, omdat het uiteindelijk toch maar één record per forum oplevert.
Probleem is alleen dat de MAX over alle rechten gedaan wordt, doordat er gebruik gemaakt wordt van LEFT JOIN's en dat levert dus de verkeerde op.
Je hebt dan een of andere functie nodig (hopelijk beschikbaar in MySQL) die als tau.User_ID IS NULL, niet de waarde in auth_.. gebruikt, maar 0.
In MSSQL zou je dan zoiets krijgen:
code:
1
MAX (CASE WHEN (tau.User_ID IS NULL) THEN 0 ELSE tga.auth_view END) AS uauth_view

Kweet alleen niet hoe je dit in MySQL zou kunnen doen.

Never underestimate the power of


  • smaij
  • Registratie: November 2000
  • Laatst online: 00:20
cameodski schreef op 18 oktober 2002 @ 13:38:
OK, doordat je groepeert op forum_id maakt het niet uit dat je alle rechten terugkrijgt, omdat het uiteindelijk toch maar één record per forum oplevert.
Probleem is alleen dat de MAX over alle rechten gedaan wordt, doordat er gebruik gemaakt wordt van LEFT JOIN's en dat levert dus de verkeerde op.
Je hebt dan een of andere functie nodig (hopelijk beschikbaar in MySQL) die als tau.User_ID IS NULL, niet de waarde in auth_.. gebruikt, maar 0.
In MSSQL zou je dan zoiets krijgen:
code:
1
MAX (CASE WHEN (tau.User_ID IS NULL) THEN 0 ELSE tga.auth_view END) AS uauth_view

Kweet alleen niet hoe je dit in MySQL zou kunnen doen.
Is het niet zo dat SELECT als laatste uitgevoerd word? dus eigenlijk heeft dat geen zin in dit voorbeeld. Het probleem zit hem wel degelijk in de GROUP BY waarschijnlijk, maar ik kan niet simpel onder die GROUP BY vandaan komen

Verwijderd

Oplossen in de data?

in TOP_GROUPS_ACCESS voor iedere forum een GROUP 0 toevoegen waar de standaard authorisatie wordt geregeld

in TOP_GROUP_AUTH USER 0 toevoegen aan GROUP 0

In de query selectie op USER_ID = 0 or USERID = [xxx]

  • smaij
  • Registratie: November 2000
  • Laatst online: 00:20
Verwijderd schreef op 18 oktober 2002 @ 14:18:
Oplossen in de data?

in TOP_GROUPS_ACCESS voor iedere forum een GROUP 0 toevoegen waar de standaard authorisatie wordt geregeld

in TOP_GROUP_AUTH USER 0 toevoegen aan GROUP 0

In de query selectie op USER_ID = 0 or USERID = [xxx]
hey ja zou inderdaad kunnen. Niet eens aan gedacht. thx. dan laat ik dus alle standaard authorisaties ook lopen via top_groups_acces 0 ipv van de kolommen in top_forums.

Maar ik heb dit probleem eigenlijk eerder gehad met het rechten uitdelen via een leuk formuliertje. daar had ik tenslotte 2 array's met waarden. Toen wou ik dus ook zon soort geintje uithalen. Dit ging om 1 LEFT JOIN waarbij ik dus ook op User_ID moest letten of ie bijvoorbeeld 1 was en daarnaast ook of deze 'NULL' was. In principe moet alles het toch mogelijk zijn zon constructie op te zetten zonder views/subqueries ?

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
smaij schreef op 18 oktober 2002 @ 13:55:
Is het niet zo dat SELECT als laatste uitgevoerd word? dus eigenlijk heeft dat geen zin in dit voorbeeld. Het probleem zit hem wel degelijk in de GROUP BY waarschijnlijk, maar ik kan niet simpel onder die GROUP BY vandaan komen
Ja, SELECT wordt in principe als laatste uitgevoerd.
Die GROUP BY heb je inderdaad nodig, maar je probleem zit daar niet, maar in de dubbele LEFT JOIN.

Eventueel zou je ook nog eens aan een UNION kunnen denken: een select die alleen wat teruggeeft als de user afwijkende (meer) rechten heeft en een select die alleen wat teruggeeft als de user geen afwijkende rechten heeft.

Never underestimate the power of


  • smaij
  • Registratie: November 2000
  • Laatst online: 00:20
cameodski schreef op 18 oktober 2002 @ 14:28:
Eventueel zou je ook nog eens aan een UNION kunnen denken: een select die alleen wat teruggeeft als de user afwijkende (meer) rechten heeft en een select die alleen wat teruggeeft als de user geen afwijkende rechten heeft.
Dan krijg je toch te maken met subqueries of niet ? :?

  • smaij
  • Registratie: November 2000
  • Laatst online: 00:20
een mager kickje :)

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Toch denk ik dat cameodski de spijker op z'n kop sloeg toen hij zei dat de rechten van groepen waar een user _niet_ bij hoort meegenomen worden in de MAX, wat dus duidelijk niet de bedoeling is.

Even vertaald naar mysql geeft dat dan:
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
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(IF(tau.Group_ID, tga.auth_view, 0)) AS uauth_view,
  MAX(IF(tau.Group_ID, tga.auth_read, 0)) AS uauth_read,
  MAX(IF(tau.Group_ID, tga.auth_post, 0)) AS uauth_post,
  MAX(IF(tau.Group_ID, tga.auth_reply, 0)) AS uauth_reply,
  MAX(IF(tau.Group_ID, tga.auth_edit, 0)) AS uauth_edit,
  MAX(IF(tau.Group_ID, tga.auth_delete, 0)) AS uauth_delete,
  MAX(IF(tau.Group_ID, tga.mod_edit, 0)) AS umod_edit,
  MAX(IF(tau.Group_ID, tga.mod_delete, 0)) AS umod_delete,
  MAX(IF(tau.Group_ID, tga.mod_closetopic, 0))AS umod_closetopic,
  MAX(IF(tau.Group_ID, tga.ban_user, 0)) AS uban_user
FROM top_categories c
INNER JOIN top_forums f ON c.Cat_ID = f.Cat_ID
LEFT 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 AND tau.User_ID = 1)
GROUP BY tga.Forum_ID
ORDER BY c.Cat_Order, f.Forum_Order ASC

En volgens mij zou dit 'm moeten zijn.

Today's subliminal thought is:


  • smaij
  • Registratie: November 2000
  • Laatst online: 00:20
Annie schreef op 19 oktober 2002 @ 18:23:
En volgens mij zou dit 'm moeten zijn.
_/-\o_ _/-\o_ _/-\o_
danke :) en de rest ook bedankt hoor!
_/-\o_ _/-\o_ _/-\o_

  • smaij
  • Registratie: November 2000
  • Laatst online: 00:20
hij werkt nog niet :(
ik dacht dus dat ie werkte.. maar vandaag ging ik met de queries klooien om zo de queries te maken voor enkel 1 forum of enkel 1 categorie. Ik ging dus testen en kwam tot de conclusie dat het nog niet werkt.

- zodra er geen groep bestaat waarin het forum aanwezig is als overrulende rechten, dan toont ie het forum niet. Ook al ben je lid van die groep of niet.

mijn query en de query van Annie:

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# 22-10-2002 selecteerd de forums, met categorie, met daarbij de rechten en overrulende rechten
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,
  MAX(IF(tau.Group_ID, tga.auth_view, f.auth_view)) AS uauth_view,
  MAX(IF(tau.Group_ID, tga.auth_read, f.auth_read)) AS uauth_read,
  MAX(IF(tau.Group_ID, tga.auth_post, f.auth_post)) AS uauth_post,
  MAX(IF(tau.Group_ID, tga.auth_reply, f.auth_reply)) AS uauth_reply,
  MAX(IF(tau.Group_ID, tga.auth_edit, f.auth_edit)) AS uauth_edit,
  MAX(IF(tau.Group_ID, tga.auth_delete, f.auth_delete)) AS uauth_delete,
  MAX(IF(tau.Group_ID, tga.mod_edit, 0)) AS umod_edit,
  MAX(IF(tau.Group_ID, tga.mod_delete, 0)) AS umod_delete,
  MAX(IF(tau.Group_ID, tga.mod_closetopic, 0))AS umod_closetopic,
  MAX(IF(tau.Group_ID, tga.ban_user, 0)) AS uban_user
FROM top_categories c
INNER JOIN top_forums f ON c.Cat_ID = f.Cat_ID
LEFT 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 AND tau.User_ID = 1)
GROUP BY tga.Forum_ID
ORDER BY c.Cat_Order, f.Forum_Order ASC

#originele versie
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(IF(tau.Group_ID, tga.auth_view, 0)) AS uauth_view,
  MAX(IF(tau.Group_ID, tga.auth_read, 0)) AS uauth_read,
  MAX(IF(tau.Group_ID, tga.auth_post, 0)) AS uauth_post,
  MAX(IF(tau.Group_ID, tga.auth_reply, 0)) AS uauth_reply,
  MAX(IF(tau.Group_ID, tga.auth_edit, 0)) AS uauth_edit,
  MAX(IF(tau.Group_ID, tga.auth_delete, 0)) AS uauth_delete,
  MAX(IF(tau.Group_ID, tga.mod_edit, 0)) AS umod_edit,
  MAX(IF(tau.Group_ID, tga.mod_delete, 0)) AS umod_delete,
  MAX(IF(tau.Group_ID, tga.mod_closetopic, 0))AS umod_closetopic,
  MAX(IF(tau.Group_ID, tga.ban_user, 0)) AS uban_user
FROM top_categories c
INNER JOIN top_forums f ON c.Cat_ID = f.Cat_ID
LEFT 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 AND tau.User_ID = 1)
GROUP BY tga.Forum_ID
ORDER BY c.Cat_Order, f.Forum_Order ASC


oftewel is de enigste 'simpelste' en 'lelijkste' optie echt alleen maar een nep groep met alle forums ? Please help :'(

  • smaij
  • Registratie: November 2000
  • Laatst online: 00:20
met het oog op de bovenste post te vernielen doe ik een nieuwe post.. (sorry voor diegene die zich daaraan storen)

ook heb ik gemerkt dat als ik nu bijvoorbeeld volgende query uitvoer
code:
1
2
3
4
5
6
7
8
                SELECT
                  f.Forum_ID,
                  MAX(IF(tau.Group_ID, tga.auth_post, f.auth_post)) AS auth_post,
                  MAX(IF(tau.Group_ID, tga.auth_reply, f.auth_reply)) AS auth_reply               
                FROM top_forums f
                 LEFT JOIN top_groups_acces tga ON (f.Forum_ID = tga.Forum_ID AND tga.Forum_ID = '10')
                 LEFT JOIN top_group_auth tau ON (tau.Group_ID = tga.Group_ID AND tau.User_ID = '1')
                GROUP BY tga.Forum_ID


ik als resultaat (1 row)
Forum_ID = 9 etc.. terugkrijg.

Dit is dus ongeacht er groepen of geen groepen bestaan, de user geautoriseerd voor is of niet.

Dat gebeurd ook met de query van de post hierboven. Daar krijg ik bijvoorbeeld

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
<?xml version="1.0"?>

<SQL-query>
    <row>
        <Cat_ID>11</Cat_ID>
        <Cat_Order>2</Cat_Order>
        <Forum_ID>9</Forum_ID>
        <Forum_Order>0</Forum_Order>
        <Cat_Title>Wielrennen</Cat_Title>
        <Cat_Moderators>testje</Cat_Moderators>
        <Forum_Name>De Nederlandse kampioenschappen \'NL\'</Forum_Name>
        <Forum_Desc>Pleur hier alles neer over de Open Nederlandse Wielren Wedstrijd</Forum_Desc>
        <Forum_Posts>9</Forum_Posts>
        <Forum_Topics>4</Forum_Topics>
        <Forum_Moderators>test</Forum_Moderators>
        <uauth_view>1</uauth_view>
        <uauth_read>1</uauth_read>
        <uauth_post>1</uauth_post>
        <uauth_reply>1</uauth_reply>
        <uauth_edit>1</uauth_edit>
        <uauth_delete>0</uauth_delete>
        <umod_edit>0</umod_edit>
        <umod_delete>0</umod_delete>
        <umod_closetopic>0</umod_closetopic>
        <uban_user>0</uban_user>
    </row>
</SQL-query>


Dit is gekopieerd uit Mysql-Front.. was de beste oplossing om snel effe een resultaat te krijgen.

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Twee opmerkingen:
Je doet een GROUP BY op tga.Forum_ID, maar deze kan NULL zijn en dan wordt het moeilijk om te begrijpen wat je GROUP BY doet. Hoogstwaarschijnlijk is het in ieder geval wat anders dan jij wilt. Dus doe die GROUP BY eens op f_Forum_ID.
En als je wilt filteren op een Forum_ID dan is het ook beter om het dmv een WHERE te doen op een tabel die er niet dmv een LEFT JOIN bijgehaald is.

Never underestimate the power of


  • smaij
  • Registratie: November 2000
  • Laatst online: 00:20
cameodski schreef op 23 oktober 2002 @ 09:46:
Twee opmerkingen:
Je doet een GROUP BY op tga.Forum_ID, maar deze kan NULL zijn en dan wordt het moeilijk om te begrijpen wat je GROUP BY doet. Hoogstwaarschijnlijk is het in ieder geval wat anders dan jij wilt. Dus doe die GROUP BY eens op f_Forum_ID.
En als je wilt filteren op een Forum_ID dan is het ook beter om het dmv een WHERE te doen op een tabel die er niet dmv een LEFT JOIN bijgehaald is.
hoe kan ik dat nou over het hoofd zien |:(

die 2de opmerking heb ik eigenlijk express gedaan omdat met WHERE geen goed resultaat gaf. maarja.. nu werkt het denk ik :P _/-\o_
Pagina: 1