Prüfung, ob in der Datenbank eine Kategorie hinterlegt ist

Hatte bisher herausragende Resonanzen auf meine Datenbankanfragen. Aufgrund dessen ein erneuter Post, vermutlich der letzte dieser Art:
Welche Tabellen sind involviert, um zu eruieren, ob für jedes Master-und Variantenprodukt eine Kategorie hinterlegt wurde und falls ja, ob die hinterlegten Kategorien bzgl. beider Produktarten dieselben sind. Vermute, dass die Tabellen product, product_category, product_category_tree involviert sind, vermisse aber in diesen Tabellen erneut ein alphanummerisches Feld, welches ich im SELECT Block verwenden kann. Dass ich dadurch eine IF Abfrage im Query brauche und eventuell ein Sub Query schreckt nicht ab, mir fehl allerdings der Ansatz…

Für’s Verständnis: Geht es um Fehler beim Import? Da Varianten standardmäßig die Kategorien erben, fehlt die Zuordnung in der DB.

SELECT p.id, p.parent_id, pt.name 
FROM product p 
LEFT JOIN product_translation pt ON p.id=pt.product_id AND pt.language_id=0x2FBB5FE2E29A4D70AA5854CE7CE3E20B 
LEFT JOIN product_category pc ON p.id=pc.product_id 
WHERE pc.product_id IS NULL;

bzw.

SELECT p.id, p.parent_id, pt.name 
FROM product p 
LEFT JOIN product_translation pt ON p.id=pt.product_id AND pt.language_id=0x2FBB5FE2E29A4D70AA5854CE7CE3E20B 
LEFT JOIN product_category pc ON p.id=pc.product_id 
WHERE pc.product_id IS NULL
AND p.parent_id IS NULL;

Für eine Sprache kann man keine individuellen Optionen einstellen, somit kann das LEFT JOIN aus der Query herausgelassen werden.

Du benötigst lediglich diese beiden Tabellen: product, product_category

Das dient nur dazu, das der betroffene Produktname angezeigt wird. Die IDs finde ich ja immer etwas unhandlich…

1 „Gefällt mir“

Mir fällt eben ein, das der sales_Channel auch noch von Relevanz sein könnte, da man dies auch dem Produkt zuordnen muss. Wie die Tabelle konkret heißt weiß ich nicht auswendig.

Stimmt. product_visibility müsste das sein.

Es geht nicht um einen Import sondern um einen Abgleich mit einem ERP System
a) Es sollten nur diejenigen Kategorien angezeigt werden, die bei Variantenprodukt und Masterprodukt abweichen. Gibt es in der Datenbank keine Abweichung, wird nichts zurück gegeben, oder mittels einer IF Klausel TRUE
b)ob für jedes Masterprodukt und Variantenprodukt überhaupt eine Kategorie zugewiesen wurden. Wenn es „Lücken“ gibt, sollte das irgendwie ersichtlich werden.
Das Query liefert 94847 Treffer. Bedeutet das etwa, dass für 94847 Produkte keine Kategorie zugewiesen wurde, da nach dem Fremdschlüssel in product_category gesucht wird, der NULL ist?
Ein…

SELECT COUNT(id) FROM product;

ergibt 153573! Das wären dann ja 58726 Produkte ohne Kategorie Zuweisung- das kann doch nicht sein…

Mach mal ein

SELECT COUNT(product_id) FROM product_category;

wieviel kommt dabei raus? 94847 ist sehr viel, aber die Query ist korrekt. Du kannst ja sicherheitshalber die Version ohne name-Feld machen

SELECT p.id, p.parent_id
FROM product p 
LEFT JOIN product_category pc ON p.id=pc.product_id 
WHERE pc.product_id IS NULL;

Dein erstes Query ergibt 95388: Also 95388 Produktverweise in der Tabelle.
Dein zweites Query ergibt natürlich ebenfalls 94847 Treffer. Das Query sieht eigentlich korrekt aus, da gehe ich mit Dir konform. Aber es kann doch nicht sein, dass so viele Produkte keiner Kategorie zugeordnet sind…
Werden Variantenprodukte überhaupt einer Kategorie zugeordnet?
Habe die Tabelle manuell über phpmyAdmin überprüft und keinen einzigen NULL Wert für den FK product_id gefunden. Wie also kann es sein ,das Dein Query derart viele Treffer liefert?

SELECT `product_id` FROM `product_category` WHERE `product_id` IS NULL;

liefert nämlich überhaupt keinen Treffer!

Standardmäßig nicht, dafür war eigentlich die zweite Variante gedacht:

SELECT p.id, p.parent_id, pt.name 
FROM product p 
LEFT JOIN product_translation pt ON p.id=pt.product_id AND pt.language_id=0x2FBB5FE2E29A4D70AA5854CE7CE3E20B 
LEFT JOIN product_category pc ON p.id=pc.product_id 
WHERE pc.product_id IS NULL
AND p.parent_id IS NULL;

durch das parent_id is null werden nur die Masterprodukte geprüft. Hab ich vorhin übersehen…

Dieses Query liefert 2400 Treffer, aber

SELECT `product_id` FROM `product_category` WHERE `product_id` IS NULL;

liefert keinen Treffer. Diese Diskrepanz kann ich mir nicht erklären!
Egal ob Materprodukt oder Variantenprodukt, wenn in der Tabelle product_category für den FK product_id jedesmal ein Eintrag vorhanden ist, warum liefern Deine Querys überhaupt einen Treffer?

Ah ja, dann sind es 2.400, der Rest sind Varianten. Die letztere liefert keinen Treffer, weil das per Definition nicht möglich ist:

`product_id` binary(16) NOT NULL

Jetzt stehe ich auf dem Schlauch: Wenn der FK nicht NULL sein darf, warum liefern Deine Querys dann überhaupt Treffer? Das wird in der WHERE Klausel doch ausgeschloßen…

Ähm, was soll denn diese Abfrage bewirken? Ergibt keinen Sinn und wird es so nie geben!

Das ist der Witz bei einem Left join, das die rechte Tabelle keinen passenden Gegenpart haben kann/muss und dann ist die id NULL

Oh, da offenbaren sich wohl SQL Defizite bei mir. Ein RIGHT JOIN ergibt tatsächlich keinen Treffer. Ich versuche jetzt, die bisherigen Posts zu analysieren und dann die Queries so zu formulieren, dass meine Eingangsfragen beantwortet werden.
An R4M: Wenn man nicht weiß, dass der FK a priori als NOT NULL definiert ist, ergibt die Abfrage im Kontext mit den bisherigen Posts durchaus Sinn

Auch ganz wichtig: beachtet bitte immer die version id der Datensätze und filtern/joint immer nur auf die live version.

Viele Grüße

Kannst Du das bitte noch päzisieren? Wenn in der Tabelle product der FK parent_id NULL ist, dann ist es ein Masterprodukt, wenn nicht, ist es ein Variantenprodukt. Inwiefern fehlt da jetzt die Zuordnung in der Datenbank?

Wenn Du die ID einer Variante mit der Tabelle product_category prüfst, ist die standardmäßig nicht in der Tabelle, da die Kategorien vom Master „geerbt“ werden. Erst wenn man explizit die Vererbung aufhebt und z.B. eine abweichende Kategorie setzt, erscheint auch die Variante in der Tabelle product_category.

Wichtiger Hinweis, Danke. Ich habe bisher nur bei Bestellungen abweichende Versionsnummern, wann kommt das bei Produkten vor?