mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: So 23.04.2017 21:36 Benutzername: Passwort: Auto-Login

Thema: [SQL] Kategorie- und Hierarchiesystem? vom 01.06.2004


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> [SQL] Kategorie- und Hierarchiesystem?
Seite: 1, 2, 3  Weiter
Autor Nachricht
eye-fx
Threadersteller

Dabei seit: 24.10.2002
Ort: -
Alter: 41
Geschlecht: Männlich
Verfasst Di 01.06.2004 15:20
Titel

[SQL] Kategorie- und Hierarchiesystem?

Antworten mit Zitat Zum Seitenanfang

Hallo,

ich habe eine Kategorietabelle, in der Kategorienamen, Kategorie-ID und Subkategorie-ID gespeichert wird.

Ich habe bereits stundenlang gegoogelt und im php-homepage Forum gesucht (ja, hier auch) aber noch keine
zufriedenstellende Lösung gefunden. "Celkos nestes Sets" habe ich ehrlich gesagt nicht überrissen.

Im Moment habe ich folgendes...

DB-STRUKTUR:
id | name | subcategory
2 kat1 0
3 kat1_sub1 2
4 kat1_sub1_sub1 3
5 kat2 0
6 kat1_sub2 2
7 kat2_sub1 5
...

SQL-CODE:
$sql = "select lvlone.name as categoryname
, lvltwo.name as subcategoryname
, lvlthree.name as subsubcategoryname
from $gallery_table as lvlone
left outer join $gallery_table as lvltwo
on lvlone.id = lvltwo.subcategory
left outer join $gallery_table as lvlthree
on lvltwo.id = lvlthree.subcategory
where lvlone.subcategory = 0";

AUSGABE-CODE:
$result = mysql_query($sql,$conn);

while ($row = mysql_fetch_array($result)) {
echo "<b>Level 1:</b> ".$row[0]." <b>Level 2:</b> ".$row[1]." <b>Level 3:</b> ".$row[2]."<br>";
}

AUSGABE:
Level 1: kat1 Level 2: kat1_sub1 Level 3: kat1_sub1_sub1
Level 1: kat1 Level 2: kat1_sub2 Level 3:
Level 1: kat2 Level 2: kat2_sub1 Level 3:
Level 1: kat2 Level 2: kat2_sub2 Level 3:
Level 1: kat2 Level 2: kat2_sub3 Level 3:


FAZIT:
Die Ausgabe ist soweit eigentlich ok. Nur habe ich das Problem, das es nicht schön untereinandersteht. Vor allem auch da die Ausgabe immer Hierarchiebaum für Hierarchiebaum ausgibt und nicht die ganze globale Struktur auf einmal... wenn man damit verstehen kann was ich meine.

Ich hätte die Ausgabe gerne so:

-kat1
-----kat1_sub1
---------kat1_sub1_sub1
---------kat1_sub1_sub2
-----kat1_sub2
-----kat1_sub3
-----kat1_sub4

-kat2
-----kat2_sub1
-----kat2_sub2
---------kat2_sub2_sub1
-----kat2_sub3
...usw.

Muss ich dazu jetzt an der Select-Abfrage oder an der Ausgabe (while schleife) selbst etwas ändern? Ich habe es auch schon mit Arrays versucht, bin aber auch gescheitert.

Oder sollte man es über zwei Tabellen anlgen (Kategorien, Subkategorien)? Eleganter wäre natürlich alles in einer Tabelle zu belassen.
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
donnerchen

Dabei seit: 06.04.2003
Ort: -
Alter: 46
Geschlecht: Männlich
Verfasst Di 01.06.2004 16:04
Titel

Antworten mit Zitat Zum Seitenanfang

Hai!

Also, sowas macht man normalerweise rekursiv. Soll heißen, Du hast eine Tabelle in der es nur gleichwertige Kategorien gibt. Um daraus einen Baum aufbauen zu können merkt sich jede Kategorie sein Eltern-Element:

ID | Name | Vorgaenger
1 | Kat 1 | -1
2 | Sub1 | 1
3 | Sub2 | 1
4 | SubSub1 | 2

Baust Du die Struktur in der DB so auf bist Du völlig flexibel. Den ganzen Kram kannst Du dann rekursiv ausgeben lassen. Wenn Du Dich mit Rekursionen nicht so auskennst müsstest Du vielleicht nochmal googeln *zwinker*

*wink*
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Anzeige
Anzeige
eye-fx
Threadersteller

Dabei seit: 24.10.2002
Ort: -
Alter: 41
Geschlecht: Männlich
Verfasst Di 01.06.2004 16:22
Titel

Antworten mit Zitat Zum Seitenanfang

hi donnerchen,

danke für deine antwort. aber das mit verweis auf den elternteil habe
ich ja bereits (feld subcategory, speichert den wert der eltern-id)
in meiner tabelle. allerdings kapiere ich die "-1" bei deiner id#1
nicht!? kannst du das mal näher erläutern?

mich interessiert da viel mehr der php-code zur ordentlichen baum-
auflistung. Lächel

danke,
eye-fx
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
gtz

Dabei seit: 15.04.2002
Ort: -
Alter: 41
Geschlecht: Männlich
Verfasst Di 01.06.2004 16:32
Titel

Antworten mit Zitat Zum Seitenanfang

pseudocode:
Code:

function recurseTree($id, $name){
  echo "<li>". $name;
  $children= select * from table where subcategory=$id;
  echo "<ul>";
  foreach($children as $child){
    recurseTree($child.id, $child.name);
  }
  echo "</ul>";
}

echo "<ul>";
$resultset= select * from table where subcategory=0;
foreach($resultset as $root){
  recurseTree($root.id, $root.name);
}
echo "</ul>";


php mußte schon selber machen.
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
eye-fx
Threadersteller

Dabei seit: 24.10.2002
Ort: -
Alter: 41
Geschlecht: Männlich
Verfasst Mi 02.06.2004 00:21
Titel

Antworten mit Zitat Zum Seitenanfang

@gtz: Jo.. danke für den Denkanstoss *zwinker*

Für alle anderen die durch die Suche oder sonstwas auf den Thread stoßen und sich fragen
wie es nun geklappt hat, hier der vervollständigte Code (quick'n dirty um 0:20 Lächel ):

Code:

function recurseTree($id, $name, $table, $conn){

  echo "<li>".$name;   
  $children  =  mysql_query("select * from $table where subcategory=$id",$conn); 
  echo "<ul>";
  while ($row_child = mysql_fetch_array($children))  {   
    recurseTree($row_child[0], $row_child[1], $table, $conn);
  }
  echo "</ul>";
}


$resultset  =  mysql_query("select * from $gallery_table where subcategory=0",$conn);
echo "<ul>";
while ($row  =  mysql_fetch_array($resultset))  {   
recurseTree($row[0], $row[1], $gallery_table, $conn);
}
echo "</ul>";
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Account gelöscht


Ort: -
Alter: -
Verfasst Mi 02.06.2004 09:22
Titel

Antworten mit Zitat Zum Seitenanfang

Sehr performant wird das aber nicht sein...
ich hab mal gegooglet (du willst zwar nichts davon wissen), aber das hier fand ich sehr nützlich zum spicken:

http://klempert.de/index.php

Ich werde mich dieser Tage ebenfalls darangeben, mein artikelmanagement darauf umzustellen. Mal sehen, was dabei rumkommt, ich finde das jedenfalls hochinteressant. Zu hause habe ich noch nen Link zu einem Artikel rumfliegen, der eine tolle Erklärung zu Nested Sets abgibt (über mehr als 3 Seiten sogar für Idioten wie mich verständlich...), ich werde mal schauen, ob ich den noch finde, dann poste ich ihn hier.
 
Achim M.

Dabei seit: 17.03.2003
Ort: -
Alter: -
Geschlecht: Männlich
Verfasst Mi 02.06.2004 09:31
Titel

Antworten mit Zitat Zum Seitenanfang

XSchinkenX hat geschrieben:
Sehr performant wird das aber nicht sein...


Ja, das denke ich auch. Bei einer kleinen Datenbank reicht das sicher aus. Wenn man größere und wachsende Systeme programmieren will, wird mit so etwas nicht glücklich werden und kommt um Nested-Sets nicht herum. Rekursionen haben halt auch ihre Nachteile ...

Gruß

Achim
  View user's profile Private Nachricht senden
gtz

Dabei seit: 15.04.2002
Ort: -
Alter: 41
Geschlecht: Männlich
Verfasst Mi 02.06.2004 09:36
Titel

Antworten mit Zitat Zum Seitenanfang

Achim M. hat geschrieben:
Rekursionen haben halt auch ihre Nachteile ...


unbestreitbar. gerade bei umfangreicheren strukturen und arg begrenzten laufzeitresourcen für php kommt man da schon schnell an die limits.
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
 
Ähnliche Themen [SQL] Wie 6 Ergebnisse anzeigen ohne ID / andere SQL-Fragen
andere kategorie, neue farbe
parent/child kategorie struktur
[Suche] Kategorie-Modul für PHPBB
Wordpress: Kategorie nicht auf Startseite anzeigen
Wordpress: kategorie auf startseite ausschließen
Neues Thema eröffnen   Neue Antwort erstellen Seite: 1, 2, 3  Weiter
MGi Foren-Übersicht -> Programmierung


Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst an Umfragen in diesem Forum nicht mitmachen.