Verschachtelte Abfrage?

unrealzero_php

Erfahrenes Mitglied
Hallo zusammen,

das nachfolgende Problem ergibt sich weil es sich um einen bestehendes Datendankmodell handelt welches nicht geändert werden kann.

Ziel: Anzeigen verschachtelter Kategorien

Problem: Es kann beliebige Ebenen 1 – 9 geben. Unterkategorien müssen angezeigt werden bis eine übergeordnete Kategorie den Status = 0 hat, dann dürfen alle unter dieser Ebene folgenden Kategorie-Einträge nicht mehr angezeigt werden.

Beispiel mit den folgenden Daten:

Sichtbar sollten folgende IDs sein:
1, 2, 6

Gibt es mittels MySQL eine Möglichkeit diese Information so abzurufen?

Hier der SQL-Dump:

Code:
CREATE TABLE IF NOT EXISTS `tbl_category` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `FK_category` int(11) NOT NULL,
  `category` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `status` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=6 ;


Code:
INSERT INTO `tbl_category` (`ID`, `FK_category`, `category`, `status`) VALUES
(1, 0, 'Ebene 1', 1),
(2, 1, 'Ebene 2', 1),
(3, 1, 'Ebene 2', 0),
(4, 3, 'Ebene 3', 1),
(5, 4, 'Ebene 4', 1),
(6, 2, 'Ebene 3', 1),
(7, 6, 'Ebene 4', 0),
(8, 7, 'Ebene 5', 1);
 
Dazu musst du mit SQL den ganzen Baum aufsetzen.
Das hab ich mal gemacht: MySQL Hierarchie Baum auslesen
Aufgrund von diesem kannsr du dann auf 0 Prüfen und die entsprechenden Daten ausgeben.
Hm.. diese Erweiterung reizt mich - mal schauen was man da machen kann
 
Hab da mal mein 2tes Beispiel ein wenig ergänzt.
SQL:
SELECT
    t.id,
    GROUP_CONCAT(pathid ORDER BY rownum DESC SEPARATOR '>') AS path
FROM
    (
        SELECT
            -- Zeilennummer. Wird später für die Sortierung des GROUP_CONCAT verwednet
            @rownum := @rownum+1 AS rownum,
            -- id die für den Pfad verwendet wird
            IF(@lastid <> mylist.id, @id := mylist.id, @id) AS pathid,
            -- Die Start-Id.
            @lastid := mylist.id AS id,
            -- bestimmen der nächsten id im Path
            @id := (SELECT FK_category FROM tbl_category  WHERE id = @id) AS parentID
        FROM
            -- Variablen initialisieren
            (SELECT @id := 0, @lastid := 0, @rownum := 0, @state := 0) AS vars,
            -- Die Tabelle mit sich selber multiplizieren umd genügend
            -- Zeilen zur Verfügung zu haben
            (SELECT id FROM tbl_category) AS myloop,
            (SELECT id FROM tbl_category) AS mylist
    ) AS t
    -- Zu jedem Eintrag den Status mit auslesen
	 INNER JOIN (SELECT id, `status` as state FROM tbl_category) AS state_list
	 	ON t.pathid = state_list.id
GROUP BY
    t.id
HAVING
	--Nur Einträge zulassen , die in ihrem Nodetree keine 0 führen
	NOT FIND_IN_SET(0,  GROUP_CONCAT(state_list.state ORDER BY rownum DESC SEPARATOR ','));

Wichtiger Hinweis zu meinen MySQL-Statements
In meinen MySQL-Statements schreibe ich Kommentare die von -- oder von # eingeleitet werden.
Einige MySQL-Editoren akzeptieren diese Kommentare nicht. Allen Voran phpMyAdmin. Um diese Scripte mit einem der betroffenen Tools zu testen, muss also jede Zeile die mit -- oder mit # beginnt gelöscht werden
 
Zuletzt bearbeitet von einem Moderator:
Zurück