[PHP && MySQl] Recursie in boom structuren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • CTVirus
  • Registratie: Januari 2000
  • Laatst online: 22:36

CTVirus

Dexterslab FAN

Topicstarter
Ik beheer een site waar een verouderd systeem is om functies voor mensen in verbanden (groepen in boomstructuur) te bepalen. Maar gezien deze functies gebruikt worden voor het rechten systeem, wil ik deze behouden en een soort 'mapping' uitvoeren die per verband en de onderligende verbanden de naam van een bepaalde functie kan wijzigen.

In het verband soccie (tappers en dergelijken) heet een lid dus tapper en een voorzitter barcommissaris, dit geld dan ook voor alle verbanden die hieronder liggen.

Dit kan ik allemaal wel uitprogrameren, maar is inmens traag, hoewel je dat ook nog wel kan optimaliseren, meerdere levels in één query, meerdere functies in éé query, ben ik opzoek naar een manier omditop een elegante en snelle manier op te lossen.

Ik heb hier al veel andere topics voor bekeken waar onder ander andere datastructuren voor bomen worden gesuggereerd en bepaalde sql die MySql niet ondersteunt.

Heeft iemand goede ideeën?

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
// functie om de gemapte functie te bepalen.
function mapfunctie($FunctieNaam,$VerbandID,$FunctieID){
  $naam_raw = query("SELECT Naam FROM functienaam WHERE VerbandID =$VerbandID AND FunctieID=$FunctieID");
  if(mysql_num_rows($naam_raw) == 0) {
    if($naam = mapfunctierecur($VerbandID, $FunctieID)) {
      return $naam;
    } else{
      return $FunctieNaam;
    }
  } else {
    $naam = mysql_fetch_array($naam_raw);
    return $naam['Naam'];
  }
}

// recursieve hulp functie voor map
function mapfunctierecur($VerbandID, $FunctieID){
  $verband_raw = query("SELECT Parent FROM verbanden WHERE VerbandID =$VerbandID");
  $verband = mysql_fetch_array($verband_raw);
  if($verband['Parent'] == 0){
    return FALSE;
  } else {
    $functienaam_raw = query("SELECT Naam FROM functienaam WHERE VerbandID ={$verband['Parent']} AND FunctieID=$FunctieID");
    if(mysql_num_rows($functienaam_raw) != 0) {
      $functienaam = mysql_fetch_array($functienaam_raw);
      return $functienaam['Naam'];
    } else {
      return mapfunctierecur($verband['Parent'], $FunctieID);
    }
  }
}

functienaam
code:
1
2
3
4
id            int(10)           UNSIGNED Nee       auto_increment              
FunctieID     int(10)           UNSIGNED Nee  0                
VerbandID     int(10)           UNSIGNED Nee  0                
Naam          varchar(30)                     Nee

verbanden
code:
1
2
3
4
5
6
7
VerbandID  int(11)       Nee         auto_increment              
Naam       varchar(255)  Ja  NULL                
Parent     int(11)       Ja  NULL                
Positie    int(11)       Ja  0                
Info       mediumtext    Ja  NULL                
Link       text          Ja  NULL                
Jaar       int(11)       Ja  NULL

Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Acties:
  • 0 Henk 'm!

  • CTVirus
  • Registratie: Januari 2000
  • Laatst online: 22:36

CTVirus

Dexterslab FAN

Topicstarter
Tja dat heb ik al idd in een ander topic al aangetroffen, maar gezien ik geen zin heb in enkele duizenden regels code te gaan wijzigen. Zoek ik verder naar een oplossing in het sql gebeuren zelf.

Is er geen manier om dingen recursief te zoeken in één tabel in één sql query?

Deze discussie is erg interresant:
http://forums.devshed.com....php?t=77423&page=2&pp=15

Er blijkt eigenlijk geen manier te zijn behalve via stored procedures of als je de diepte weet (of via bepaalde oracle sql extensies, maar ja...)

Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 20:38

alienfruit

the alien you never expected

Er is hier een heel goed boek over geschreven, door een database guru:
Kliker de klik

[ Voor 11% gewijzigd door alienfruit op 06-11-2004 14:16 . Reden: url verkloot de layout :| ]