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.