Marktplatz - Eine große Auswahl an neuen und hilfreichen Modulen sowie modernen Templates für die modified eCommerce Shopsoftware
Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: Leere Kategorien löschen

    Joachim78

    • Neu im Forum
    • Beiträge: 31
    Leere Kategorien löschen
    am: 11. Januar 2014, 12:05:50
    Hallo,
    ich suche einen SQL Befehl um alle leeren Kategorien und Unterkategorien restlos zu löschen.

    Leer = ohne Artikel.

    Betroffen sein müssten wohl die Tabellen categories, categories_description und products_to_categories.

    Leider überfordert dies meine Kentnisse und ich kann keinen Ansatz liefern. Da dies jedoch auch für viele andere User interessant sein dürfte, hoffe ich auf eure Hilfe.

    Gruß
    Joachim

    Linkback: https://www.modified-shop.org/forum/index.php?topic=28900.0
    Shop Hosting

    ShopNix

    • Viel Schreiber
    • Beiträge: 1.208
    Re: Leere Kategorien löschen
    Antwort #1 am: 11. Januar 2014, 14:09:30
    Vielleicht schaust Du Dir mal diesen Ansatz an: http://shopnix.wordpress.com/category/allgemein/sql/

    Da geht es zwar um Prüfung, nicht um Löschung, aber die grundsätzlich Vorgehensweise ist die Gleiche. Ausgangspunkt muß für Dein Problem die Tabelle products_to_categories sein.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.992
    • Geschlecht:
    Re: Leere Kategorien löschen
    Antwort #2 am: 11. Januar 2014, 15:01:00
    Leicht off topic:
    Bei solchen Anliegen merkt man, daß es eine sog. Referentielle Integrität in der DB des Shopsystems leider nicht gibt.
    Eigtl. sollte man das auch mal angehen.
    Eine "backwards compatibility" wäre dadurch nicht zwingend gefährdet.

    Gruß,
    noRiddle

    Joachim78

    • Neu im Forum
    • Beiträge: 31
    Re: Leere Kategorien löschen
    Antwort #3 am: 13. Januar 2014, 21:26:09
    @ShopNix: Danke für die Anregung.

    Folgendes habe ich gebastelt:
    Code: SQL  [Auswählen]
    SELECT categories_id, parent_id FROM categories AS t1 WHERE t1.parent_ID!='' AND NOT EXISTS (SELECT categories_id FROM categories AS t2 WHERE t2.parent_id = t1.categories_id) AND NOT EXISTS (SELECT * FROM products_to_categories WHERE t1.categories_id = products_to_categories.categories_id);

    Wenn ich das richtig sehe funktioniert es und ist auch einigermaßen schnell. Trotzdem wäre es schön, wenn ein Experte einmal sagen könnte ob es richtig und effizient ist.

    Vielen Dank.

    Gruß
    Joachim

    ShopNix

    • Viel Schreiber
    • Beiträge: 1.208
    Re: Leere Kategorien löschen
    Antwort #4 am: 14. Januar 2014, 10:06:23
    Hallo Joachim,

    ich fürchte, ich habe Dich auf eine falsche Fährte gesetzt. Nur mit SQL wirst Du nicht hinkommen, weil SQL keine Rekursion umsetzen kann, die Datenstruktur in sich verschachtelt ist. Jede Kategorie kennt nur ihre Elternkategorie, weiß aber nichts über ihre Großeltern. Wenn während der laufenden Pflege des Shops auch Kategorien verschoben wurden, kann das sehr leicht auch die Reihenfolge der categorie_id durcheinanderwürfeln, also bringt Dich auch eine Sortierung nicht weiter.

    Zudem kannst Du Kategorien haben, die keine Produkte enthalten, nur Unterkategorien.

    Ich habe gestern den Abschnitt Kategorien für meine neue Sitemap fertiggestellt. Dort habe ich zunächst mal die Kategorien in ein Array geschrieben, das klappte mit meinen Testdaten ganz gut. Dann habe ich einen Kategoriebaum aus einem Live-Shop genommen und festgestellt, dass mein Array kleiner war als die Zahl der Kategorien. Als ich dieses Verhalten analysierte, sah ich, dass die Ursache in der oben beschriebenen Verschachtelung lag. Dabei fand ich interessanterweise auch eine völlig verwaiste Kategorie. Ich löste das Problem mit Hilfe einer rekursiven Funktion.

    Den Code stelle ich Dir gern zur Verfügung. Du könntest dann jeweils an den Stellen, an denen ich den Kategoriebaum zusammensetze, Deine Prüfung und Löschung einsetzen.

    Während ich so darüber nachdenke, fällt mir noch ein anderer Ansatz ein: Man könnte die Tabelle categories kopieren und anschließend leeren. Anschließend geht man über products_to categories und legt jede fehlende Kategorien aus der Kopie neu an. Dann müsste man den parent jeder neu angelegten Kategorie suchen und ggfls aus der Kopie holen. Du siehst auch hier wieder eine Rekursion.

    @noRiddle:
    Ich hab' das vor über 10 Jahren mal mit einer osCommerce-DB versucht und die Referenzen auf PostgreSQL abgebildet. Ganz so einfach ist es nicht.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.992
    • Geschlecht:
    Re: Leere Kategorien löschen
    Antwort #5 am: 14. Januar 2014, 17:34:22
    Warum Postegre ?
    Mit der InnoDB Engine kann man doch Referentielle Integrität auch in MySQL realisieren.
    Aber egal, ist ein großes Thema und hier off topic.

    Gruß,
    noRiddle

    ShopNix

    • Viel Schreiber
    • Beiträge: 1.208
    Re: Leere Kategorien löschen
    Antwort #6 am: 14. Januar 2014, 18:00:33
    Damals gab's noch keine InnoDB.

    MySQL 3.23, wer erinnert sich noch?  ;)

    Joachim78

    • Neu im Forum
    • Beiträge: 31
    Re: Leere Kategorien löschen
    Antwort #7 am: 14. Januar 2014, 21:30:39
    @ShopNix: Bist du tatsächlich sicher, dass dies so falsch ist?

    Ich habe die von mir gepostete Abfrage bereits in der Praxis getestet und sie hat einwandfrei funktioniert. Im Endeffekt muss die Kategorie die Großeltern doch auch garnicht kennen? Es reicht doch das eine Kategorie ohne Unterkagorie und ohne Produkte vorhanden ist?

    Gruß
    Joachim

    ShopNix

    • Viel Schreiber
    • Beiträge: 1.208
    Re: Leere Kategorien löschen
    Antwort #8 am: 15. Januar 2014, 11:17:41
    Du würdest so auch eine Kategorie löschen, die zwar keine Produkte enthält, aber vielleicht eine Unterkategorie mit Produkten. Die wäre dann aus dem Baum verschwunden, und damit letztendlich auch die Produkte.

    Joachim78

    • Neu im Forum
    • Beiträge: 31
    Re: Leere Kategorien löschen
    Antwort #9 am: 15. Januar 2014, 12:01:28
    Ich dachte genau dies würde ich mit:
    Code: SQL  [Auswählen]
    WHERE t2.parent_id = t1.categories_id
    verhindern?

    Dadurch sollten doch nur Kategorien erwischt werden die nirgendwo als Mutterkategorie vorhanden sind.

    Gruß
    Joachim

    ShopNix

    • Viel Schreiber
    • Beiträge: 1.208
    Re: Leere Kategorien löschen
    Antwort #10 am: 15. Januar 2014, 13:00:13
    Hallo Joachim,

    der Ansatz ist sicher nicht ganz falsch, aber ich habe Dein Query auf meinen Testdatenbestand losgelassen,  und es kam nicht das erwünschte Ergebnis raus. Das kann bei Deinen Daten anders sein, aber es hinterlässt ein ungutes Gefühl. Ich kann Dir also keinen Freibrief ausstellen.

    Wenn Du eine SEO_URL einer tiefer liegenden Kategorie mit etlichen Ebenen betrachtest, siehst Du auch, warum das so ist:

    [...]:::224_422_424_1014.html

    Die Kategorie 1014 weiß nur von 424, die wiederum nur von 422, ...

    In meinem speziellen Falle hätte das Query auf jeden Fall weniger als gewünscht gelöscht, und zwar 250 von 318 Sätzen. Es hätte aber auch nicht mehr als gewünscht löschen können, weil ich gar kein Produkt habe, das richtig verknüpft ist.

    Mehr Zeit würde ich nun ungern in Dein Problem investieren, auch wenn es an sich eine interessante Diskussion ist.

    Andre Kern

    • Fördermitglied
    • Beiträge: 426
    Re: Leere Kategorien löschen
    Antwort #11 am: 12. Mai 2016, 09:35:46
    Hallo, ich hänge auch gerade an dem Thema. Wäre nicht der richtige Ansatz, zu prüfen welche Kategorien existieren, aber nicht in der Tabelle 'products_to_categories' vorkommen?

    LG
    Shiva

    Andre Kern

    • Fördermitglied
    • Beiträge: 426
    Re: Leere Kategorien löschen
    Antwort #12 am: 12. Mai 2016, 14:11:42
    Hallo nochmal, ich habe mal ein wenig gebastelt und der aktuelle Stand ist folgender:

    Mit diesem Code kann man die Kategorien anzeigen lassen die keine Produktzuweisung haben:

    Code: SQL  [Auswählen]
    SELECT categories.categories_id
      FROM categories
     WHERE categories.categories_id NOT IN
    ( SELECT DISTINCT products_to_categories.categories_id FROM products_to_categories )

    Theoretisch könnte man nun einfach alle anhaken und löschen.
    Das Problem ist nur, bei einer Kategorie von mehreren Ebenen werden natürlich auch die TOP-Kategorien angezeigt und wenn ich jetzt einfach alle lösche, sind die Hauptebenen auch weg.

    Also benötigt man noch eine individuelle Erweiterung des Befehls, je nach Menütiefe (Anzahl der Subkategorien).

    Wie könnte man denn darstellen, bzw. bestimmen das der abgleich erst ab Kategorieebene 4 beginnt?

    LG
    Shiva
    Modulshop - Eine große Auswahl an neuen und hilfreichen Modulen für die modified eCommerce Shopsoftware
    1 Antworten
    1305 Aufrufe
    23. Oktober 2018, 01:42:25 von noRiddle (revilonetz)
    7 Antworten
    8796 Aufrufe
    27. April 2012, 12:38:27 von amsterdamer
    5 Antworten
    2303 Aufrufe
    11. Mai 2020, 17:42:38 von CHESSBASE
               
    anything