sql >> Database >  >> RDS >> Mysql

Een overnamequery schrijven die is geschreven in SQL met behulp van een inner join?

Als je naar een boomhiërarchie kijkt, werkt het geneste setmodel redelijk goed, maar brengt het een grote verandering met zich mee in de structuur van je overervingstabel.

Als u een willekeurig gerichte grafiek implementeert (u heeft bijvoorbeeld een 'auteur'-profiel dat artikelen kan publiceren maar geen opmerkingen kan modereren, en een 'moderator'-profiel dat opmerkingen kan modereren maar geen artikelen kan publiceren), wilt u misschien kijken voor een andere oplossing.

Een mogelijkheid is om de overerving op te geven en de machtigingen voor elke groep handmatig in te stellen.

Een andere mogelijkheid is om de overervingstabel te gebruiken om zowel directe als indirecte overerving op te slaan (dat wil zeggen, een knooppunt zou gerelateerd zijn aan al zijn kinderen met behulp van een "directe" relatie, evenals al zijn nakomelingen met behulp van een "indirecte" relatie). Deze strategie vereist dat u alle indirecte relaties in de tabel opnieuw maakt wanneer u een van de directe relaties wijzigt (dit kan worden gedaan door een eenvoudige INSERT SELECT te gebruiken ), maar heeft het voordeel dat er slechts een enkele join nodig is om toegang te krijgen tot alle nakomelingen.

Het basisidee is:

CREATE TABLE group_inherit (
  parent INT NOT NULL, 
  child INT NOT NULL, 
  distance INT NOT NULL, 
  PRIMARY KEY (parent,child)
);

/* Clean up indirect relations */
DELETE FROM group_inherit WHERE distance <> 0;

/* Repeat this for each D > 0 until the maximum distance is reached */
INSERT IGNORE INTO (parent, child, distance) 
SELECT fst.parent, snd.child, D
FROM group_inherit fst
INNER JOIN group_inherit snd ON snd.parent = fst.child
WHERE fst.distance = 0 AND snd.distance = D - 1;

/* Select all permissions for a user type */
SELECT perm.*
FROM group_permissions perm
INNER JOIN group_inherit ON perm.moderator = child
WHERE parent = ?

De lus op afstand moet worden gedaan totdat er geen elementen van afstand D-1 meer beschikbaar zijn, wat kan worden gedaan met behulp van een selectiequery of, als je die hebt, meta-informatie over hoeveel regels er zijn ingevoegd.



  1. Alle rijen retourneren met de MAX-waarde in SQL?

  2. Vermijd het benoemen van door de gebruiker opgeslagen procedures SP% of SP_%

  3. Laravel 5.1 - Een databaseverbinding controleren

  4. SYS-wachtwoord wijzigen in RAC