Alle EAV-Tabellen (z.B. catalog_product_entity_varchar) verfügen über die Spalte store_id, die den StoreView bestimmt, für den der Wert gelten soll. Für Standardwerte enthält diese Spalte den Wert 0, für alle anderen StoreViews einen Wert größer 0. Wird z. B. der Name eines Produkts für einen StoreView festgelegt, wird in der EAV-Tabelle eine zweite Zeile für das gleiche Produkt und Attribut eingefügt. Wird im Backend der StoreView-spezifische Wert durch Setzen des Schalters Standardwerte verwenden gelöscht, wird auch die Zeile in der EAV-Tabelle gelöscht.
Unser Ziel besteht nun darin, eine schnelle SQL-Abfrage zu formulieren, die für alle Produkte den Namen für ein StoreView (z. B. store_id=2) ausgibt. Ist der StoreView-spezifische Name nicht festgelegt, muss der Standardwert für store_id=0 ausgegeben werden. Mit einem StoreView-Filter bestehend aus einer einfachen WHERE-Bedingung würde diese Abfrage für einige Produkte mehrere Zeilen liefern:
SELECT entity_id, sku, eav_vc.value as name, store_id FROM catalog_product_entity
JOIN catalog_product_entity_varchar eav_vc USING(entity_id)
JOIN eav_attribute eav ON (eav_vc.entity_type_id=eav.entity_type_id AND eav_vc.attribute_id=eav.attribute_id
AND eav.attribute_code = 'name')
WHERE store_id IN (0, 2);
Filtern wir nur die Zeilen mit store_id=2, bekommen wir nur die Produkte, bei den der Name für diesen StoreView festgelegt wurde. Gruppieren wir die Liste nach der entity_id, verschwinden die StoreView-spezifischen Werte aus der Liste, da die jeweilige Gruppe stets die erste Zeile mit dem Standardwert enthält.
Der SQL-Trick besteht nun darin, durch Verschachtelung der Abfrage eine absteigende Sortierung vor der Gruppierung durchzuführen, sodass die Zeile mit der store_id=2 immer als erste in jeweiliger Gruppe auftaucht:
SELECT * FROM (
SELECT entity_id, sku, eav_vc.value as name, store_id FROM catalog_product_entity
JOIN catalog_product_entity_varchar eav_vc USING(entity_id)
JOIN eav_attribute eav ON (eav_vc.entity_type_id=eav.entity_type_id AND eav_vc.attribute_id=eav.attribute_id
AND eav.attribute_code = 'name')
WHERE store_id IN (0, 2)
ORDER BY store_id DESC
) AS t
GROUP BY entity_id;