SQL: Selbstreferenzierende Tabelle auslesen

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Benutzeravatar
QCO
Mitglied
Beiträge: 708
Registriert: 15.03.2003 12:30
Wohnort: Leipzig

SQL: Selbstreferenzierende Tabelle auslesen

Beitrag von QCO »

Ich hab eine selbstreferenzierende Tabelle ala
---------------------------------------------
|| dir_id || dir_name || dir_parent ||
---------------------------------------------
1 verzeichnis1 0
2 unterverz1 1
3 test 1
.
.

Damit könnte man im Prinzip ja beliebig tiefe Strukturen bauen.
Jetzt möchte ich von einem Verzeichnis gern die übergeordneten feststellen. OK, geht mit einer rekursiven Funktion oder einer Schleife geht das. Aber dann brauch ich für jedes Verzeichnis einen Query, das können eine ganze Menge werden (und wenn man das dann noch mehrmals macht ).
Kann man auch irgendwie in SQL das Problem mit einer Abfrage erschlagen?
Oder gibt es noch einen anderen Weg?
Schnelle direkte Hilfe? Modeinbau? Umfassender, persönlicher Support? Ein individuelles Design/Template?
Ich bin käuflich und löse zu kleinen Preisen Deine Probleme. Anfragen bitte per PN oder Mail.
Benutzeravatar
itst
Ehrenadmin
Beiträge: 7418
Registriert: 21.08.2001 02:00
Wohnort: Büttelborn bei Darmstadt
Kontaktdaten:

Beitrag von itst »

Du möchtest eine Abfrage, um alle übergeordneten Verzeichnisse aller Verzeichnisse zu bekommen?
Sascha A. Carlin,
phpBB.de Ehrenadministrator
:o
Benutzeravatar
QCO
Mitglied
Beiträge: 708
Registriert: 15.03.2003 12:30
Wohnort: Leipzig

Beitrag von QCO »

wenn's geht ja...

(hallelujah, es ist doch jemand am sonntag morgen im netz)
Schnelle direkte Hilfe? Modeinbau? Umfassender, persönlicher Support? Ein individuelles Design/Template?
Ich bin käuflich und löse zu kleinen Preisen Deine Probleme. Anfragen bitte per PN oder Mail.
Benutzeravatar
itst
Ehrenadmin
Beiträge: 7418
Registriert: 21.08.2001 02:00
Wohnort: Büttelborn bei Darmstadt
Kontaktdaten:

Beitrag von itst »

Also, es mag sein, das sich ein SQL-Experte so eine Query vorstellen kann... ich denke nicht, das es geht. Vor allem dann nicht, wenn es darum geht, in einer Abfrage alle übergeordneten Verzeichnisse aller Verzeichnisse zu finden. Das sind ja teilweise ganze Bäume...
Sascha A. Carlin,
phpBB.de Ehrenadministrator
:o
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Ich habe über so ein Problem auch schon lange gegrübelt und keine wirkliche Lösung gefunden. Das einzig mögliche ist so:

Code: Alles auswählen

SELECT d1.*, d2.* FROM dir AS d1, dir AS d2 WHERE d2.dir_id = d1.dir_parent
Das könntest du so immer weiterführen mit d3, d4 etc. Allerdings musst du für jede Ebene einen Alias erstellen und erhältst nicht automatisch den kompletten Baum.
Benutzeravatar
QCO
Mitglied
Beiträge: 708
Registriert: 15.03.2003 12:30
Wohnort: Leipzig

Beitrag von QCO »

also bis jetzt hab ich es so gemacht:

Code: Alles auswählen

function get_parent_dirs($dir_id)
{
	global $db;
	$returner = array();

	$sql = 'SELECT dir_parentdir FROM ' . DIRS_TABLE . ' WHERE dir_id=' . $dir_id;
	$result = $db->sql_query($sql);
	$row  = $db->sql_fetchrow($result);

	while( $row['dir_parentdir'] != ROOT_DIR )
	{
		$sql = 'SELECT dir_id, dir_name, dir_parentdir FROM '. DIRS_TABLE . ' WHERE dir_id=' . $row['dir_parentdir'];
		$result = $db->sql_query($sql);
		$row = $db->sql_fetchrow($result);
		
		$returner[] = array( 'dir_id' => $row['dir_id'], 'dir_name' => $row['dir_name'] );
	}

	return $returner;
}
Was mir sonst noch eingefallen ist:
  • man könnte einfach mit einem riesigen Folge 'blinder' LEFT JOINs arbeiten...

    Code: Alles auswählen

    SELECT a.*, b.*, c.*, d.*, e.* FROM (((table AS a
    LEFT JOIN table b ON b.dir_parentdir=a.dir_id) 
    LEFT JOIN table c ON c.dir_parentdir=b.dir_id) 
    LEFT JOIN table d ON d.dir_parentdir=c.dir_id) 
    LEFT JOIN table d ON e.dir_parentdir=d.dir_id) 
    WHERE ...
    Nachteil: es ist plötzlich doch nicht mehr unedlich tief verschachtelbar
  • wenn man ein weiteres Datenbankfeld anlegt, in dem die Verzeichnistiefe dieses Verzeichnisses steht, kann man daraus einen beliebig großen JOIN konstruieren. Aber ist das wirklich effektiver?
Hilfe!
Schnelle direkte Hilfe? Modeinbau? Umfassender, persönlicher Support? Ein individuelles Design/Template?
Ich bin käuflich und löse zu kleinen Preisen Deine Probleme. Anfragen bitte per PN oder Mail.
Antworten

Zurück zu „Coding & Technik“