Zum Inhalt springen

Sauberer SQL Befehl - Kategorien Deaktivieren


errox

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Klotzkopp
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...