Nach Navigationsstruktur abfragen

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