errox Geschrieben 5. Mai 2014 Geschrieben 5. Mai 2014 Hallo, zunächst mal, falls das im falschen Topic ist, bitte verschieben. Danke! Noch eine Info: Ich arbeite mit MySQL Ich habe ein Shopsystem, in dem ich eine Kategorietabelle hab. Die Wichtigsten Spalten sind: - ID - Parent (Übergeordnete ID, falls es eine untergeordnete Kategorie ist z.B. Drucker -> Laserdrucker) - Description (Name der Kategorie) Dann habe ich eine Tabelle, in dem die Bezüge abgespeichert sind - ID - KategorieID - ArtikelID Ich würde gerne alle Kategorien deaktivieren, die keine Artikelzuordnung haben und die übergeordneten Kategorien auch. Beispiel: Drucker -> Laserdrucker, Drucker -> Tintenstrahler. Wenn Tintenstrahler und Laserdrucker keine Artikel beinhalten, sollen diese auch deaktiviert werden. Ich habe auch bereits eine SQL abfrage, blos habe ich 2 Probleme. 1. Sie ist unsauber 2. Dort werden die übergeordneten Kategorien nicht deaktiviert. Nur die Aktuelle: SELECT cBase.ID AS ID FROM s_categories cBase // Nur Unterste Kategorien die nicht als Parent verwendnet werden LEFT JOIN s_categories cParent ON cParent.parent = cBase.ID // Ohne Artikelzuordnung LEFT JOIN s_articles_categories ac ON ac.categoryID = cBase.ID // Aktive Artikel! LEFT JOIN s_articles aActive ON aActive.Active = 1 AND aActive.ID = ac.articleID WHERE cParent.ID IS NULL AND cBase.Blog = 0 AND (cBase.external IS NULL OR cBase.external = '') GROUP BY cBase.ID HAVING COUNT(aActive.ID) = 0 Jetzt habe ich eine Idee: Ich mach einen SQL Befehl, der mir die Summe Rekrusiv anzeigt. Aber wie? Also z.B. Laserdrucker: 2, Tintenstrahler: 4. Also will ich beim Ergebnis auch Drucker mit 6 haben. Hier mal der "Grundbefehl" SELECT c.id, c.parent, c.description, COUNT(ac.ID) FROM s_categories c LEFT JOIN s_articles_categories ac ON ac.categoryID = c.ID GROUP BY c.id, c.parent, c.description Meine Idee wäre es, im SQL Befehl so oft zu Joinen, bis ich nichts mehr finde (Also fix für 5 ebenen) aber das wäre nicht so schön. Kann man da was machen? Bietet SQL die Möglichkeit? Liebe Grüße errox Zitieren
Gast Geschrieben 5. Mai 2014 Geschrieben 5. Mai 2014 Nur zum Verständnis: Als Ergebnis soll SQL dir sozusagen nur Laserdrucker, Tintenstrahldrucker usw. liefern, nicht aber Drucker und falls es die Kategorie Festplatte gibt jedoch ohne Unterscheidung S-ATA 2,5/S-ATA 3,5 usw. sollen diese niocht angezeigt werden. Verstehe ich das so richtig? Wenn du das meinst muss nach dem JOIN nur noch NOT NULL hinzugefügt werden. Zitieren
errox Geschrieben 5. Mai 2014 Autor Geschrieben 5. Mai 2014 Hallo, nicht ganz, ich will ein Summenergebnis. Also Name | Count Drucker | 7 Laser | 3 Farblaser | 1 Sw Laser | 2 Tinte | 4 Bezug: Drucker -> Laser -> Farblaser Drucker -> Laser -> Sw Laser Drucker -> Tinte Am ende will ich alle rausladen, wo Count = 0, und die alle deaktivieren. Das dient darum, um auch die "Kopfkategroien" zu deaktvieren, die Unterkategorien haben, die keine Artikel beinhalten Zitieren
Klotzkopp Geschrieben 5. Mai 2014 Geschrieben 5. Mai 2014 Wenn dein Kategorie-Baum eine bekannte maximale Tiefe hat, könntest du das so machen: SELECT root.ID, COUNT(item.ID) FROM s_categories root LEFT JOIN s_categories sub1 ON root.ID = sub1.parentID LEFT JOIN s_categories sub2 ON sub1.ID = sub2.parentID LEFT JOIN s_articles_categories item ON item.categoryID = root.ID OR item.categoryID = sub1.ID OR item.categoryID = sub2.ID GROUP BY root.ID[/code] Das ist für Tiefe 3, was für dein Beispiel passt. Für jede weitere Ebene brauchst du ein zusätzliches LEFT JOIN der Kategorie-Tabelle auf sich selbst, sowie eine weitere Bedingung für das item-JOIN. Zitieren
errox Geschrieben 5. Mai 2014 Autor Geschrieben 5. Mai 2014 Leider ist das Unbegrenzt :/ (1-n) Gibst da keine andere Möglichkeit? Zitieren
Klotzkopp Geschrieben 5. Mai 2014 Geschrieben 5. Mai 2014 (bearbeitet) Leider ist das Unbegrenzt :/ (1-n)Sicherlich nicht. Erstens hast du nicht unendlich viel Platz für die Daten, zweitens kann niemand einen unendlich tiefen Baum anlegen. Es gibt sicherlich eine real sinnvolle obere Grenze für die Baumtiefe. Gibst da keine andere Möglichkeit?Klar, aber das ist mit Arbeit verbunden. Eine Lösungsmöglichkeit ist, für jede Kategorie ein Zahlen-Intervall (Von-Bis) so anzulegen, so dass das Intervall jeder Kategorie innerhalb des Intervalls der Elternkategorie liegt, aber von den Intervallen der Geschwister-Kategorien abgegrenzt ist. Das erfordert einiges an Aufwand beim Anlegen der Kategorien. Unter Umständen musst du alle Intervalle neu vergeben. Aber damit kannst du über eine einfache Bereichssuche alle Unterkategorien finden. Unendlich viele Kategorien kannst du damit aber auch nicht anlegen Bearbeitet 5. Mai 2014 von Klotzkopp Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.