Seite 2 von 2

Verfasst: 28.11.2006 02:45
von mgutt
Eine andere Idee, die ich nicht für schön aber akzeptabel halte:

Code: Alles auswählen

<?php

/*
1 = Mutter
2 = Vater
z.B.:
2.1.2 = Vater.(Groß-)Mutter.(Urgroß-)Vater = Urgroßvater, der als Kind eine Tochter hat, die wiederrum die Mutter des Vaters des Kindes ist.
Man könnte auch simpel durchzählen, aber so ist es ein wenig übersichtlicher.
*/

// Alle unsere Einträge aus der Datenbank
$ids = array(1,2,3,4,5,6,7);

// Wie viele Einträgen haben wir
$countids = count($ids);

// Für jeden Eintrag ermitteln wir nun die IDs des Stammbaums und schreiben sie in ein Array
foreach( $ids as $id )
{
	$sql = "SELECT mtr, vtr
			FROM stammbaum
			WHERE id = $id";
	$1 = $mtr;
	$2 = $vtr;
	// Mutter
	if ( $1 )
	{
		$sql = "SELECT mtr, vtr
				FROM stammbaum
				WHERE id = $1";
		$1.1 = $mtr;
		$1.2 = $vtr;
		// Großmutter
		if ( $1.1 )
		{
			$sql = "SELECT mtr, vtr
					FROM stammbaum
					WHERE id = $1.1";
			$1.1.1 = $mtr;
			$1.1.2 = $vtr;
		}
		// Großvater
		if ( $1.2 )
		{
			$sql = "SELECT mtr, vtr
					FROM stammbaum
					WHERE id = $1.2";
			$1.2.1 = $mtr;
			$1.2.2 = $vtr;
		}
	}
	// Vater
	if ( $2 )
	{
		$sql = "SELECT mtr, vtr
				FROM stammbaum
				WHERE id = $2";
		$2.1 = $mtr;
		$2.2 = $vtr;
		// Großmutter
		if ( $2.1 )
		{
			$sql = "SELECT mtr, vtr
					FROM stammbaum
					WHERE id = $2.1";
			$2.1.1 = $mtr;
			$2.1.2 = $vtr;
		}
		// Großvater
		if ( $2.2 )
		{
			$sql = "SELECT mtr, vtr
					FROM stammbaum
					WHERE id = $2.2";
			$2.2.1 = $mtr;
			$2.2.2 = $vtr;
		}
	}
	// Array der Datenbank hinzufügen
	$array = array($1, $2, $1.1, $1.2, $2.1, $2.2, $1.1.1, $1.1.2, $1.2.1, $1.2.2, $2.1.1, $2.1.2, $2.2.1, $2.2.2) 
	$array = serialize($array);
	$sql = "UPDATE stammbaum
			SET tree = $array
			WHERE id = $id";
}

/*
Das wären dann bei 4 Generationen (inkl. Kind) 7 Datenbankabfragen.
6 Generationen benötigen 31 Abfragen. Ich denke die Zahl ist vertretbar
Dazu kommt dann noch das eine Update und man wäre bei max. 32 Datenbankverbindungen.
*/

/*
Stammbaum darstellen:
*/

// ID über die Url ziehen
$id = $_GET['id'];

// Name des Kindes und Baum auslesen
$sql = "SELECT name, tree
		FROM stammbaum
		WHERE id = $id";

// Datensatz vorbereiten:
$array = unserialize($tree);
$where_ids = implode(",", $array);

// Alle Namen des Baumes auslesen
$sql = "SELECT name
		FROM stammbaum
		WHERE id IN ($where_ids)";
$array = mysql_fetch_array();
$1 = $array[0];
$2 = $array[1];
$1.1 = $array[2];
$1.2 = $array[3];
$2.1 = $array[4];
$2.2 = $array[5];
$1.1.1 = $array[6];
$1.1.2 = $array[7];
$1.2.1 = $array[8];
$1.2.2 = $array[9];
$2.1.1 = $array[10];
$2.1.2 = $array[11];
$2.2.1 = $array[12];
$2.2.2 = $array[13];

?>

Verfasst: 24.04.2007 16:16
von Emanuelle_1982
Olli Oberhausen hat geschrieben:vielleicht hilft dir folgender Link zu Nested Sets etwas. http://www.klempert.de/nested_sets/artikel/

Die wahrscheinlichst eleganteste Methode theoretisch unendlich tiefe Baumstrukturen zu gestalten.

Gruß, Olli
auch wenn es nicht direkt mit dem Thema zu tun hat - DANKE
der Link ist klasse, super verständlich

Verfasst: 24.04.2007 21:32
von mgutt
Emanuelle_1982 hat geschrieben:
Olli Oberhausen hat geschrieben:vielleicht hilft dir folgender Link zu Nested Sets etwas. http://www.klempert.de/nested_sets/artikel/

Die wahrscheinlichst eleganteste Methode theoretisch unendlich tiefe Baumstrukturen zu gestalten.

Gruß, Olli
auch wenn es nicht direkt mit dem Thema zu tun hat - DANKE
der Link ist klasse, super verständlich
Schau Dir die Erklärung noch an:
http://phpperformance.de/nested-sets-hi ... -in-mysql/

Ich habe es dank beiden Links gut umsetzen können.

Das einzige Problem was ich noch habe ist, dass man eigentlich nicht nur Kategorien, sondern auch Artikel/Themen selbst auch in das Nested Set aufnehmen sollte um besser zählen zu können.

Aber damit bekomme ich Probleme mit meinem Datenbankkonzept.

Die Sache mit dem Stammbaum habe ich übrigens immer noch nicht zufriedenstellend lösen können (Nested Sets hilft da nicht). Werde das aber nicht aufgeben.

Gruß
Marc

Verfasst: 25.04.2007 07:24
von Emanuelle_1982
@mgutt:
die gerade gepostete Erklärung finde ich nicht so gut, aber das ist ja Geschmackssache, sie entspricht eher meinen Parabeldenken (nimm etwas was du kennst/verstehst und übertrage es auf etwas anderes: in dem Falle der Wurm der da rumkriecht)

[Edited: der Vorschlag zu deinem Problem war auch nicht praktikabel (statt auf Personen auf die Ehen schauen, ein Kind entstammt immer einer Ehe, aber eine Ehe entspringt ja ebenfalls 2 Ehen]


Liebe Grüße
Emma