Query zusammenbauen

gingerswelt

Mitglied
Hallo zusammen,

ich habe zwei Tabellen:

1. Tabelle:
f_id, type, ....

2. Tabelle:
f_id (fremdschluessel von oben), text

Beim Typ können drei Ebenenstufen angenommen werden (0,1,2).
Jetzt möchte ich in einer Abfrage alle Texte ab Typ 0 ausgeben.
Wie mache ich das?
 
Hallo gingerswelt,
ich verstehe nicht ganz, was Du mit "ab Typ 0" meinst. Falls das heißen soll: "alle Texte mit Typ größer/gleich 0", dann wohl so:
SQL:
SELECT
  `tabelle2`.`text`
FROM
  `tabelle2`
LEFT JOIN
  `tabelle1` ON `tabelle1`.`f_id` = `tabelle2`.`f_id`
WHERE
  `tabelle1`.`type` >= 0
 
Zuletzt bearbeitet von einem Moderator:
Das geht schon in die richtige Richtung.
Nur brauche ich zu jede Ebene 1 auch eine Information zur Ebene2 in einem Datensatz
 
Oha.

verstehe ich das richtig, dass hier eine Art hierarchisches System dargestellt werden soll? Dass also einem Text auf Ebene 0 ggf. mehrere Texte auf Ebene 1 zugeordnet sein sollen, welche ihrerseits jeweils wieder mehrere Texte auf Ebene 2... usw.? Das würde die ganze Sache erheblich verkomplizieren. Dann kommen so Schlagworte wie Rekursion, Subqueries oder GROUP_CONCAT ins Spiel.

Falls es das ist, dann schaffe ich eine Antwort heute leider nicht mehr ;)
 
Wenn da so ist, dann reichen die von Dir gegebenen Infos nicht aus. In Deiner Tabellen-Beschreibung fehlt eine Zuordnung vom "Kind-Text" zum "Eltern-Text", die Verknüpfung von Tabelle1 zu Tabelle2 (Typ) ist ja nur eine Definition der Ebene.

Gibt es nur diese 3 Ebenen oder könnten das auch mehr werden? Wenn es mehr werden können (theoretisch unbegrenzt viele?), dann lässt sich das in einem SQL-Statement nicht machen, da SQL (zumindest MySQL) keine rekursiven Aufrufe kennt. Die hierarchische Struktur muss dann durch mehereren SQL-Abfragen in einer sich ständig selbst aufrufenden Funktion der Programmier-Umgebung (PHP?) aufgebaut werden. Eine Ebenen-Angabe braucht man da eigentlich nicht, die ergibt sich ja aus den "Generationen".

Ich zeig' das mal kurz an einer ganz einfachen hierarchischen Struktur mit MySQL und PHP:
Zunächst wird eine Tabelle mit den Texten benötigt, in diesem Beispiel heißt diese Tabelle `test`:
Code:
+--+---+----------------+
|id|pid|inhalt          |
+--+---+----------------+
|5 |0  |Gemüse          |
|6 |5  |Gurken          |
|7 |5  |Tomaten         |
|8 |5  |Sellerie        |
|9 |5  |Blumenkohl      |
|10|0  |Obst            |
|11|10 |Steinobst       |
|12|10 |Kernobst        |
|13|10 |Beeren          |
|14|11 |Apfel           |
|15|11 |Birne           |
|16|11 |Quitte          |
|17|12 |Pfirsich        |
|18|12 |Kirsche         |
|19|12 |Mirabelle       |
|20|13 |Blaubeere       |
|21|13 |Himbeere        |
|22|13 |Grizzlybeere    |
|23|14 |Granny Smith    |
|24|14 |Golden Delicious|
|25|14 |Macintosh       |
|26|7  |Coctailtomte    |
|27|7  |Strauchtomate   |
|28|7  |Grüne Tomate    |
|29|7  |Ketchup         |
+--+---+----------------+
`pid` steht für "Parent-ID", also die ID des übergeordneten Datensatzes aus der selben Tabelle. Ist `pid` = 0, dann heißt das, dass diese Element auf der obersten Ebene liegt.

Folgendes PHP-Script erzeugt eine hierarchische Ausgabe:
PHP:
<?php 
	
	// Die Rekursiv-Funktion:
	function rekHierarchie ($pid = 0, $ebene = 0) {
		
		global $con;
		
		// Notausgang:
		if ($ebene > 100) return NULL;
		
		// DB-Abfrage:
		$sql = "SELECT `id`, `inhalt` FROM `test` WHERE `pid` = ".$pid." ORDER BY `id`";
		$rst = mysql_query($sql, $con) or die(mysql_error($con));
		
		// Datensatz-Schleife:
		while ($row = mysql_fetch_assoc($rst)) {
			
			// Einrückung:
			for ($i = 0; $i < $ebene; $i++) echo ' - ';
			
			// Text ausgeben:
			echo $row['inhalt'];
			
			// Zeilenumbruch:
			echo '<br>';
			
			// Rekursiv-Aufruf:
			rekHierarchie($row['id'], $ebene + 1);
			
		} // end while
		
		// Abfrage auflösen:
		mysql_free_result($rst);
		
	} // end rekHierarchie
	
	
	// DB-Anmelde-Parameter (eigene Werte einsetzen):
	$host     = '';
	$user     = '';
	$passwort = '';
	$db       = ''
	
	// An DB anmelden:
	$con = mysql_connect($host, $user, $passwort);
	mysql_select_db($db, $con);
	
	// Rekursive Ausgabe starten:
	rekHierarchie();
	
	// Von DB abmelden:
	mysql_close();
	
?>
Das ist jetzt natürlich ein ganz einfaches Beispiel. Auf die Art sind die allermeisten CMS-Plattformen aufgebaut, obwohl das die primitivste Form der hierarchischen Gliederung mit Datenbanken ist. Wenn Du da richtig fett einsteigen willst, dann empfehle ich die Suche nach "Nested Sets" bei Google oder in diesem Forum.

Viele Grüße,
 

Neue Beiträge

Zurück