Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Sauberer SQL Befehl - Kategorien Deaktivieren

Empfohlene Antworten

Veröffentlicht

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

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.

  • Autor

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

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.

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.