[MySQL] Subquerie omzetten naar join (Mysql 3)

Pagina: 1
Acties:

  • neothor
  • Registratie: Oktober 2004
  • Laatst online: 02-10-2023
Ik ben een website aan het met maken met een groep en rechten systeem.
Omdat de mysql versie lager dan 4.1 bleek te zijn dan ik dacht moet ik een aantal queries herschrijven omdat deze subqueries bevat.

De tabellen zien er als volgt uit:

module_action
Veldnaam Type Key
module_tag varchar(240) Ja
module_action_tag varchar(240) Ja

groep_rechten
Veldnaam Type Key
groep_id int(11) Ja
module_tag varchar(240) Ja
action_tag varchar(240) Ja

Dan om alle rechten te krijgen die groep 1 niet had gebruikte ik de volgende querie.
Hierin is `m` `module_action` en `g` `groep_rechten`
SQL:
1
2
3
4
5
6
7
8
SELECT `m`.`module_tag` ,`m`.`action_tag` 
FROM `module_action`
WHERE CONCAT(`m`.`module_tag`,`m`.`action_tag`) 
NOT IN (
SELECT CONCAT(`g`.`module_tag`,`g`.`action_tag`)
FROM `groep_rechten`
WHERE `g`.`group_id` = '1'
)


Met behulp van de mysql manual kom ik op het volgende uit.
SQL:
1
2
3
4
5
SELECT DISTINCT `module_action`.`module_tag` ,`module_action`.`action_tag` 
FROM `module_action` 
LEFT JOIN `groep_rechten` 
ON CONCAT(`module_action`.`module_tag`,`module_action`.`action_tag`)=CONCAT(`groep_rechten`.`module_tag`,`groep_rechten`.`module_action_tag`) WHERE `groep_rechten`.`groep_id` != '1' 
OR `groep_rechten`.`groep_id` IS NULL


Dan krijg ik alle rechten die groep 1 niet heeft zolang niet zowel groep 1 als een andere groep een recht heeft. Dan krijg ik het bijbehorende recht als nog.

Hopenlijk heeft iemand een oplossing.

p.s. Een mysql upgrade zit er niet direct in.

Last.fm | LinkedIn | Twitter


  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 01-12 20:47
Dat stukje "where group_id = 1" hoort bij de tweede query, dus die voorwaarde moet je bij de join voorwaarde zetten.
Distinct lijkt me niet nodig.
Dus
SQL:
1
2
3
4
SELECT ...
FROM module_action
LEFT JOIN groep_rechten ON (concat(..) = concat(..) AND groep_rechten.group_id = 1)
WHERE groep_rechten.group_id IS NULL

  • neothor
  • Registratie: Oktober 2004
  • Laatst online: 02-10-2023
Dit is helaas niet de oplossing.
Nu krijg ik namelijk alle rechten die niet aan een groep gekoppelt zijn maar groep 1 daarbij niet meegerekend.

Last.fm | LinkedIn | Twitter


  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 01-12 20:47
Een test geeft aan dat mijn query dezelfde gegevens terug geeft als jouw eerste query.

Kun je anders een paar voorbeeld gegevens en resultaat gegevens posten?

  • neothor
  • Registratie: Oktober 2004
  • Laatst online: 02-10-2023
Je hebt inderdaad gelijk.
Er stond = '1' waar ik != '1' las.

De query die je voorstelde schijnt te werken.
Bedankt.

Last.fm | LinkedIn | Twitter