Nach Navigationsstruktur abfragen
am 06.07.2006 21:58:37 von Mark Knochen
hallo,
ich habe eine Tabelle für die Navigation:
ID, name, naviID
(naviID funktioniert wie parentID)
und eine Tabelle für die einzelnen Seiten:
ID, title, naviID, naviEbene
naviID ist - falls vorhanden - die direkte Verbindung zum Navigationspunkt
andernfalls kann die Seite über naviEbene der Navigationsstruktur
zugeordnet werden (... z.B. für "sie befinden sich hier")
Nun möchte ich alle Seite per SELECT aufgelistet haben - AUßER die
Seiten, die zu einem bestimmten Hauptnavigationspunkt und dessen
Unterpunkten gehören.
Ich könnte mir nun zum einen per SELECT * alle Seiten holen und dann
per PHP mit einer Funktion die einzelnen rows auf Zugehörigkeit zur
Navigation testen.
Aber geht das auch mit MySQL?
Danke
Mark
Re: Nach Navigationsstruktur abfragen
am 07.07.2006 00:23:34 von Johannes Vogel
Hi Mark
Mark Knochen wrote:
> ich habe eine Tabelle für die Navigation:
> ID, name, naviID
> (naviID funktioniert wie parentID)
Weshalb nennst du sie dann nicht so?
> und eine Tabelle für die einzelnen Seiten:
> ID, title, naviID, naviEbene
> naviID ist - falls vorhanden - die direkte Verbindung zum Navigationspunkt
Falls nicht vorhanden, ist die Seite nicht in der Navigation eingebunden?!
> andernfalls kann die Seite über naviEbene der Navigationsstruktur
> zugeordnet werden (... z.B. für "sie befinden sich hier")
>
> Nun möchte ich alle Seite per SELECT aufgelistet haben - AUßER die
> Seiten, die zu einem bestimmten Hauptnavigationspunkt und dessen
> Unterpunkten gehören.
> Ich könnte mir nun zum einen per SELECT * alle Seiten holen und dann
> per PHP mit einer Funktion die einzelnen rows auf Zugehörigkeit zur
> Navigation testen.
> Aber geht das auch mit MySQL?
Du könntest Stored Procedures verwenden.
http://dev.mysql.com/doc/refman/5.1/en/stored-procedure-synt ax.html
Oder - absolut nicht zu empfehlen - verschachtelte selects. Das auch
nur, wenn dir die Tiefe bekannt ist. Mein Ansatz:
mysql> create table Navigation ( id int, naviid int);
Query OK, 0 rows affected (0.00 sec)
mysql> insert into Navigation values (1,0),(2,1),(3,1),(4,2),(5,2),(6,0);
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0
select @id1:=id id from Navigation where naviid = 1
union
select @id2:=id id from Navigation where naviid in (@id1)
union
select @id3:=id id from Navigation where naviid in (@id2)
+---------+
| @id:=id |
+---------+
| 2 |
| 3 |
+---------+
Eigentlich müssten 4 und 5 auch kommen. Es funktioniert also noch nicht
komplett. Ich glaube aber, dass der Ansatz klar sein sollte - und dass
dieser Lösungsansatz nicht gerade optimal ist.
Und als dritten Ansatz: Du könntest auf Nested Sets umsteigen.
http://www.develnet.org/36.html
HTH, Johannes