Vraag & Antwoord

Webprogrammeren & scripting

[SQL] Hoe kan ik dit met 1 sql statement oplossen?

6 antwoorden
  • LS, Ik heb mijn gehele user & rights management van mijn site in een MySql DB gestopt. 2 tabellen zijn belangrijk voor mijn vraag: RIGHTS(RightID, RightName) GROUPRIGHTS(GroupRightID, GroupID, RightID) In die 2e tabel staat dus de koppelingen van welke rechten bij welke groep horen. Zodra ik de rechten ga ophalen van een user (die tot een of meerdere groepen behoort), wil ik [u:63d8bef50a]geen[/u:63d8bef50a] numerieke array van de tot die groep behorende rechten hebben, maar een tabel met 2 kolommen, met in de de 1e kolom alle rechten en in de 2e kolom de naam van het recht of niets naargelang hij/zij dat recht heeft of niet. Dit moet op te lossen zijn in 1 SQL statement.. Tot hier was ik gekomen: [code:1:63d8bef50a]SELECT rights1.RightName AS AllRights, rights2.RightName AS SelectedUserRights FROM rights as rights1 left JOIN rights as rights2, grouprights ON grouprights.groupid = 4 AND grouprights.rightid = rights2.rightid WHERE rights1.RightName = rights2.RightName OR rights1.RightName IS NULL[/code:1:63d8bef50a] Maar dit werkt niet (krijg alle rechten in beide kolommen....), er moet nog een voorwaarde bij, maar ik weet niet welke... Alvast bedankt!
  • Het lukt me wel als ik alleen een right selecteer (en niet via de 2e tabel): [code:1:ef2d12f1a1]SELECT rights1.RightName AS AllRights, rights2.RightName AS SelectedUserRights FROM rights as rights1 LEFT JOIN rights as rights2 ON rights2.rightid = 4 AND rights2.rightid = rights1.rightid[/code:1:ef2d12f1a1]
  • Je bedoelt zoiets? [code:1:8cf6e60c9a] SELECT r.RightName AS AllRights, NOT ISNULL(g.GroupID) AS SelectedUserRights FROM RIGHTS AS r LEFT JOIN GROUPRIGHTS AS g ON (r.RightID = g.RightID AND (g.GroupID = 4 OR g.GroupID IS NULL)); [/code:1:8cf6e60c9a]
  • Jep, perfect! Bedankt! Waar zat nu mijn denkfout? Een van de verschillen is dat jij de tabel 'Rights' maar 1x aanroept, waarom? De volgende stap is dit resultaat behalen met een UserID ipv een GroupID via de tabel: UserGroups(UserGroupID*, UserID, GroupID) Een user kan tot meerdere groupen behoren, de rechten die hij dan uiteindelijk ontvangt is het totaal van alle groepen (DISTINCT). Moet ik die tabel 'UserGroups' dan opnemen in de 'FROM' of de 'LEFT JOIN' regel? En mogen de voorwaardes dan in de 'ON' clausule of moeten die dan weer in een aparte 'WHERE' clausule... Kweetut, ben er nog niet helemaal in thuis, maar ik begin het te leren... Alvast bedankt!
  • [quote:7b8a443d82="Bremmeteng"]Waar zat nu mijn denkfout? [/quote:7b8a443d82] Je hebt nog niet helemaal door hoe een join in elkaar steekt (via de JOIN ON notatie). En daardoor is het moeilijk om te zien wat de oplossing voor je vraagstuk is. Dus het is waarschijnlijk geen denkfout, meer een klein gebrek aan kennis. [quote:7b8a443d82="Bremmeteng"]Een van de verschillen is dat jij de tabel 'Rights' maar 1x aanroept, waarom?[/quote:7b8a443d82] Bij een outer join krijg je null-waarden terug voor waarden die niet gejoined kunnen worden. Van dat gegeven maak ik gebruik in mijn query. De niet gekoppelde rechten geven een NULL en door hierop te controleren kan ik dus aangeven of het recht geselecteerd is, of niet. [quote:7b8a443d82="Bremmeteng"]De volgende stap is dit resultaat behalen met een UserID ipv een GroupID via de tabel: UserGroups(UserGroupID*, UserID, GroupID) Een user kan tot meerdere groupen behoren, de rechten die hij dan uiteindelijk ontvangt is het totaal van alle groepen (DISTINCT). Moet ik die tabel 'UserGroups' dan opnemen in de 'FROM' of de 'LEFT JOIN' regel? En mogen de voorwaardes dan in de 'ON' clausule of moeten die dan weer in een aparte 'WHERE' clausule...[/quote:7b8a443d82] Je zal de UserGroups tabel ook moeten joinen aan je result. Belangrijk om te weten is dat bij een join de ON clause per gejoinede row geldt. En dat de WHERE clause voor het totale resultaat van de join geldt. Dus de condities in de ON filteren tijdens de join en de condities in de where filteren na afloop. Mocht je er niet uitkomen dan horen we het wel. Maar natuurlijk wel eerst zelf proberen :D
  • Ik heb dmv trial-and-error een SQL statement gevonden die het gewenste resultaat geeft: [code:1:2e1b59bd83]SELECT RIGHTS.RightName AS AllRights, MAX(NOT ISNULL(GROUPRIGHTS.GroupID)) AS SelectedUserRights FROM RIGHTS, USERGROUPS LEFT JOIN GROUPRIGHTS ON (RIGHTS.RightID = GROUPRIGHTS.RightID AND GROUPRIGHTS.GroupID = USERGROUPS.GroupID AND (USERGROUPS.UserID = 3 OR USERGROUPS.GroupID IS NULL)) GROUP BY AllRights[/code:1:2e1b59bd83] Maar ik vind die Max() met GROUP BY clause niet echt mooi... Je hebt gelijk over het gebrek aan kennis over de JOIN. Kan je een site aanbevelen met meer uitleg hierover? www.w3schools.com behandeld de 'JOIN' maar erg summier...

Beantwoord deze vraag

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.