php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 10.08.2009, 14:04  
Neuer Benutzer
 
Registriert seit: 10.08.2009
Beiträge: 6
PHP-Kenntnisse:
Fortgeschritten
Pierre Dole befindet sich auf einem aufstrebenden Ast
Standard Tree/Menü/Navigation mit einem Select

Moin,
gibt es eine Möglichkeit mit nur einer Abfrage eine ganze Navigation aus der Datenbank auszulesen?

Um es verständlicher zu machen, hier die Tabelle mit der ich arbeiten will:

Code:
id | title | link
1 | navi01 | 0
2 | navi02 | 0
3 | navi03 | 0
4 | subnavi1 | 2
5 | subnavi2 | 2
6 | subnavi3 | 2
7 | noch eine subnavi | 5
8 | subnaviXYZ | 6
aussehen soll es folgendermaßen, wenn man z.B. ID 5 übergeben bekommt:

Code:
navi01
navi02
  subnavi1
  subnavi2
    noch eine subnavi
  subnavi3
navi03
Frage 1:
Kann man das mit einer Abfrage meistern, sodass ich in der while-Schleife a. an dem Inhalt und b. an der Reihenfolge nichts mehr ändern muss?

Frage 2:
Wenn es nicht geht, was ist eurer Meinung nach die bessere Lösung, die ganze Navigation in ein Array einlesen und mit dem Array zu arbeiten, oder eine rekursive Funktion basteln, die sich mit Abfragen (Link-)Ebene für (Link-)Ebene hocharbeitet?

Gruss
Pierre
Pierre Dole ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 10.08.2009, 14:15  
Erfahrener Benutzer
 
Registriert seit: 28.03.2008
Beiträge: 1.847
HPR1974 wird schon bald berühmt werden
Standard

ich würde spontan orschlagen nested sets zu verwenden
HPR1974 ist offline   Mit Zitat antworten
Alt 10.08.2009, 16:38  
Neuer Benutzer
 
Registriert seit: 10.08.2009
Beiträge: 6
PHP-Kenntnisse:
Fortgeschritten
Pierre Dole befindet sich auf einem aufstrebenden Ast
Standard

Ich habe mir das hier durchgelesen und muss zugeben, ich habe von diesem Model noch nicht gehört. Ich sage es mal so: es würde mir weiterhelfen, ist aber umständlich in der Handhabung (SQL-Statements) und lässt noch ein paar Fragen offen.
Eine Frage, die sich mir schon zu Anfang des Artikels auftat ist: Was ist, wenn die "Wurzel" dicker ist, als nur ein Eintrag, wie es bei mir der Fall ist. So, wie es dort beschrieben wurde, habe ich das Gefühl, dass alles nur von einem Nennen abstammen darf.
Pierre Dole ist offline   Mit Zitat antworten
Alt 10.08.2009, 23:55  
Neuer Benutzer
 
Benutzerbild von DaFox
 
Registriert seit: 06.08.2009
Beiträge: 28
PHP-Kenntnisse:
Fortgeschritten
DaFox befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Pierre Dole Beitrag anzeigen
Ich habe mir das hier durchgelesen und muss zugeben, ich habe von diesem Model noch nicht gehört. Ich sage es mal so: es würde mir weiterhelfen, ist aber umständlich in der Handhabung (SQL-Statements) und lässt noch ein paar Fragen offen.
Die Handhabung ist nicht wirklich umständlich und sowas lässt sich ja auch in der Middleware leicht abstahieren. Du hast mit dem Modell im Vergleich zum Parent-Id-Modell den Vorteil, dass du ganze Teilbäume sehr performant auslesen kannst. Beim PID-Modell hast du rekursive Abfragen, die gerade bei MySQL ziemlich teuer sind.

Hier siehst du ja ein paar Beispielabfragen und drei Modelle im Vergleich:
Nested Sets – Verschachtelte Bäume mit MySQL - Arne Klempert

Zitat:
Zitat von Pierre Dole Beitrag anzeigen
Eine Frage, die sich mir schon zu Anfang des Artikels auftat ist: Was ist, wenn die "Wurzel" dicker ist, als nur ein Eintrag, wie es bei mir der Fall ist. So, wie es dort beschrieben wurde, habe ich das Gefühl, dass alles nur von einem Nennen abstammen darf.
Was heisst darf? Das ist ein Modell, kein Gesetz.

Zwei Möglichkeiten die mir spontan einfallen:

1. Du hängst dann einfach einen Wurzelknoten in den Baum, den du nicht mit ausgibst
2. Du führst eine root_id in der Tabelle ein die immer die ID der Wurzel des Teilbaums enthält
DaFox ist offline   Mit Zitat antworten
Alt 11.08.2009, 01:28  
Erfahrener Benutzer
 
Registriert seit: 03.06.2009
Beiträge: 140
PHP-Kenntnisse:
Anfänger
thomasE befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Eine Frage, die sich mir schon zu Anfang des Artikels auftat ist: Was ist, wenn die "Wurzel" dicker ist, als nur ein Eintrag, wie es bei mir der Fall ist. So, wie es dort beschrieben wurde, habe ich das Gefühl, dass alles nur von einem Nennen abstammen darf.
Zitat:
Du führst eine root_id in der Tabelle ein die immer die ID der Wurzel des Teilbaums enthält
hat er doch schon: link = 0

3. möglichkeit du hängst einfach weitere wurzelknoten an
damit sähe deine Tabelle bspw. so aus:
Code:
 id | link | lft | rgt | title
----+------+-----+-----+------------------
  1 |    0 |   1 |  12 | navi01
  2 |    0 |  13 |  14 | navi02
  3 |    0 |  15 |  16 | navi03
  4 |    2 |   2 |   3 | subnavi1
  5 |    2 |   4 |   7 | subnavi2
  6 |    2 |   8 |  11 | subnavi3
  7 |    5 |   5 |   6 | noch eine subnavi
  8 |    6 |   9 |  10 | subnaviXYZ
wie DaFox schon meinte, es steht nirgendwo geschrieben, dass sich alles auf einen Wurzelknoten zurückführen lassen muss.

Zitat:
ist aber umständlich in der Handhabung
aufwändig, nicht umständlich, es benötigt mehrere queries zur Ausführung einer Aktion (neuer Eintrag, ...), nur wirst du dein Navigationsmenu nicht soooo häufig ändern. ausserdem kannst du die befehle als procedure auf dem sql-server ablegen, sodass du auch hier nur einen query aus PHP absenden musst und alles andere auf dem SQL-Server erledigt wird.

das komplizierteste ist, die queries einmal, deinen Bedürfnissen entsprechend, aufzubauen.

aber mehr dazu morgen.
thomas
thomasE ist offline   Mit Zitat antworten
Alt 11.08.2009, 09:28  
Neuer Benutzer
 
Registriert seit: 10.08.2009
Beiträge: 6
PHP-Kenntnisse:
Fortgeschritten
Pierre Dole befindet sich auf einem aufstrebenden Ast
Standard

Moin,
nach einer erholsamen und ausgeschlafenen Nacht, habe ich auf dem Weg zur Arbeit mir das alles durch den Kopf gehen lassen. Ich werde mir eine Klasse schreiben, da ich eh alles in OOP mache, die das ganze handhabt. Da fällt das Rumhantieren mit den SQL-Abfragen weg.

Zitat:
Was heisst darf? Das ist ein Modell, kein Gesetz.
Ok, ich mich da etwas ungeschickt ausgedrückt. Ich meinte, dass ich es so verstanden habe, dass es so sein muss, damit das Modell funktioniert.


Zitat:
ausserdem kannst du die befehle als procedure auf dem sql-server ablegen
Darüber würde ich gerne mehr erfahren. Kannst du mir paar Stichworte nennen, nach denen ich suchen kann?
Pierre Dole ist offline   Mit Zitat antworten
Alt 11.08.2009, 10:08  
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.032
lazydog befindet sich auf einem aufstrebenden Ast
Standard

Z.B. Stored Procedures
__________________
Gruss
L
lazydog ist offline   Mit Zitat antworten
Alt 11.08.2009, 10:28  
Erfahrener Benutzer
 
Registriert seit: 03.06.2009
Beiträge: 140
PHP-Kenntnisse:
Anfänger
thomasE befindet sich auf einem aufstrebenden Ast
Standard

schau mal hier rein Count von Produkten in Kategorien und Unterkategorien, hatte da eine procedure geschrieben um aus der jetzigen Struktur das nested-set aufzubauen, vielleicht erklärt es auch einpaar fragen zum Aufbau von procedures in mysql.

wenn du konkrete implementierungen von procedures für deine Abfragen besprechen willst, müsstest du hier noch beschreiben, wie die Änderungen in der Struktur durchgeführt werden sollen.

thomas
thomasE ist offline   Mit Zitat antworten
Alt 11.08.2009, 10:30  
Neuer Benutzer
 
Registriert seit: 10.08.2009
Beiträge: 6
PHP-Kenntnisse:
Fortgeschritten
Pierre Dole befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Für gespeicherte Routinen muss die Tabelle proc in der mysql-Datenbank vorhanden sein
Bevor ich meinen Webspace-Anbieter anrufe, hat man heutzutage standardmäßig Zugriff auf die mysql-Datenbank?
Pierre Dole ist offline   Mit Zitat antworten
Alt 12.08.2009, 09:55  
Neuer Benutzer
 
Registriert seit: 10.08.2009
Beiträge: 6
PHP-Kenntnisse:
Fortgeschritten
Pierre Dole befindet sich auf einem aufstrebenden Ast
Standard

Ich habe mich ein wenig in die Server-Routinen eingelesen und bleibe vorerst doch bei einer einfachen Klasse. Ist sonst zu viel neues zum "verdauen".

Hab aber noch eine Frage bezüglich NestedSets. Ich möchte die Navigation verzeichnisweise auslesen. Habe ein Testscript geschrieben, mit dem ich mir alles ausgeben lasse.

Wenn ich die ganze Navigation anzeigen will, wird es richtig gemacht und es kommt das hier:
Code:
root - 7
  Aktivitäten - 2
    Gruppen - 1
      Fotografen - 0
  bds_aktuell - 3
    januar - 0
    februar - 0
    märz - 0

(titel / offspring)
Das Problem ist, wenn ich eine ID übergebe, z.B. von "januar", sollte es so aussehen:

Code:
root - 7
  Aktivitäten - 2
  bds_aktuell - 3
    januar - 0
sieht aber so aus:
Code:
root - 7
  bds_aktuell - 3
    januar - 0
Es wird der direkte weg zum angegebenen Element angezeigt.


Die SQL-Abfragen habe ich aus den Beispiel übernommen und in einer Klasse angepasst.
Code:
public function get($id="") {
	if(!$this->result) {
		if($id) {
			$sql="
				SELECT p.*,
					ROUND ((p.rgt - p.lft - 1) / 2) AS offspring
			    FROM ".$this->table." n,
			        ".$this->table." p
				WHERE n.lft BETWEEN p.lft AND p.rgt
			    	AND n.id = ".$id."
				ORDER BY n.lft;";
		} else {
			$sql="
				SELECT n.*,
			         COUNT(*)-1 AS level,
			         ROUND ((n.rgt - n.lft - 1) / 2) AS offspring
			    FROM ".$this->table." AS n,
			         ".$this->table." AS p
				WHERE n.lft BETWEEN p.lft AND p.rgt
				GROUP BY n.lft
				ORDER BY n.lft;";
		}
		
		$this->result = $this->db->query($sql);
	}
	
	$i = $this->db->fetchArray($this->result);
	if(!$i)
		$this->result = $i;
	return $i;
}
php-Code:
Code:
// [Datenbank-Objekt], [NestedSet-Tabelle]
$ns = new NestedSet($db, "navigation");

while($i = $ns->get(19))
	echo $i['title']." - ".$i['offspring']."<br>";
Tabelle:
Code:
id 	title 	            query 	status 	       LFT     	RGT
1 	root 	            NULL 	0 	        1 	16
2 	Aktivitäten 	        	1       	2 	7
4 	Gruppen 	        	1 	        3 	6
12 	bds_aktuell 	        	1       	8 	15
19 	januar        	  	        1 	        9 	10
20 	februar       	        	1        	11 	12
21 	märz           	  	        1       	13 	14
22 	Fotografen   	        	1       	4 	5
Pierre Dole ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] 2 Select-Abfragen in eine Variable speichern TheMav Datenbanken 3 18.06.2009 00:29
[Erledigt] Select * where in (Select ...) Geschwindigkeitsproblem Wolla Datenbanken 14 20.05.2009 15:16
SQL select fehlerhafte Resultate. Ist PHP 64 Bit das Problem? peterw Server, Hosting und Workstations 6 21.04.2009 09:19
miltiple select formula mike12 PHP Tipps 2009 5 10.02.2009 00:20
[Erledigt] Kein Ergebnis bei SELECT (MySQL 4.1.9) dr.e. Datenbanken 4 15.06.2008 19:54
[Erledigt] Mysql Insert Select + Concat Hu5eL Datenbanken 14 10.06.2008 10:39
[gelöst] SELECT COUNT(*) FROM SUBSELECT braucht ewig! stefanjann Datenbanken 3 25.02.2008 08:44
Select - Preselect simsalabim HTML, Usability und Barrierefreiheit 6 22.11.2007 20:21
SELECT AS geht bei AVG net cyberholic Datenbanken 0 04.05.2006 09:43
[JavaScript] Event Handler in form select - Syntax? winfo_cologne HTML, Usability und Barrierefreiheit 5 29.03.2006 16:47
Probleme mit Inner Select Datenbanken 0 19.10.2005 15:22
selbst gelöst! Select <option> kleines Problem Dropdow 24bits PHP Tipps 2005-2 0 15.10.2005 19:19
[Erledigt] SELECT in SELECT PHP Tipps 2005 5 06.04.2005 22:30
[Erledigt] 2 mal select 1 form PHP-Fortgeschrittene 1 01.09.2004 20:13
selektierter wert in select box anzeigen PHP Tipps 2004 6 30.08.2004 13:49

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
http://www.php.de/datenbanken/57941-tree-menue-navigation-mit-einem-select.html, php tree navigation, php tree menu, php tree, navigation tree php, menünavigation mit php, html select baum, tree menu ordner php, mysql baum auslesen, navigation menu php klasse datenbank, tree navigation, html select tree, php mysql tree navigation, php tree menu mysql, php navigation tree, treemenu php, php navigation baum, tree mysql auslesen, tree menu select, tree menu php

Alle Zeitangaben in WEZ +2. Es ist jetzt 08:23 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum