Kategoriebaum neu aufbauen

Hallo exwe,

ich habe mir für meinen Import das unten stehende SQL-Skript gebaut, welches die s_articles_categories_ro wieder korrigiert. Damit tauchen bei mir keine “Ups! Ein Fehler ist aufgetreten!” mehr auf Grin

Wenn es dennoch Probleme geben sollte: Unter http://community.shopware.com/files/downloads/kategorie-doku-12972014.pdf ist die Tabelle beschrieben.

-- Zu jeder Kategorie-ID alle im Baum übergeordneten IDs (inkl. der eigenen ID holen) als pathid holen
-- Also für 110 mit path |104|102|6|3|
-- id	pathId
-- 110	110
-- 110	104
-- 110	102
-- 110	6
-- 110	3
create temporary table cat_pathIds
	select id, pathId from (
		select id, path, id as pathId from s_categories where path is not null
		union select id, path, 0+SUBSTRING_INDEX(path,'|',1) pathId from s_categories where path is not null
		union select id, path, 0+SUBSTRING_INDEX(SUBSTRING_INDEX(path,'|',2),'|',-1) pathId from s_categories
		union select id, path, 0+SUBSTRING_INDEX(SUBSTRING_INDEX(path,'|',3),'|',-1) pathId from s_categories 
		union select id, path, 0+SUBSTRING_INDEX(SUBSTRING_INDEX(path,'|',4),'|',-1) pathId from s_categories 
		union select id, path, 0+SUBSTRING_INDEX(SUBSTRING_INDEX(path,'|',5),'|',-1) pathId from s_categories 
		union select id, path, 0+SUBSTRING_INDEX(SUBSTRING_INDEX(path,'|',6),'|',-1) pathId from s_categories 
		union select id, path, 0+SUBSTRING_INDEX(SUBSTRING_INDEX(path,'|',7),'|',-1) pathId from s_categories 
		union select id, path, 0+SUBSTRING_INDEX(SUBSTRING_INDEX(path,'|',8),'|',-1) pathId from s_categories 
		union select id, path, 0+SUBSTRING_INDEX(SUBSTRING_INDEX(path,'|',9),'|',-1) pathId from s_categories 
	) pathIds where pathId > 0
;

-- Die neue s_articles_categories_ro (ohne ids) erstellen
create temporary table RECREATED_articles_categories_ro
	select s_articles_categories.articleID, pathIds.pathId as categoryID, 
			s_articles_categories.categoryID as parentCategoryID 
		from s_articles_categories
		inner join cat_pathIds as pathIds on (s_articles_categories.categoryID = pathIds.id and pathIds.pathId > 0)
	order by articleID, parentCategoryID, categoryID ;

-- Alte Einträge entfernen
truncate s_articles_categories_ro;
-- Korrigierte Einträge ablegen
INSERT INTO s_articles_categories_ro
	(articleID,categoryID,parentCategoryID)
(
	SELECT RECREATED_articles_categories_ro.articleID,
		RECREATED_articles_categories_ro.categoryID,
		RECREATED_articles_categories_ro.parentCategoryID
	FROM RECREATED_articles_categories_ro
);

Achtung: Die Quelltextdarstellung macht z.B. aus “>” “>”, also bei der Übernahme noch mal auf HTML-Entities kontrollieren!

Hinweis: Die alten s_articles_categories_ro.id bleiben nicht erhalten, aber darauf scheint es in Shopware keine Verweise zu geben, weswegen eine etwas aufwendigere Variante des Skript mit Erhalt der IDs wohl nicht notwendig ist.

Für mehr Ebenen muss man nur entsprechend viele unions ergänzen:

union select id, path, 0+SUBSTRING_INDEX(SUBSTRING_INDEX(path,'|',10),'|',-1) pathId from s_categories 
union select id, path, 0+SUBSTRING_INDEX(SUBSTRING_INDEX(path,'|',11),'|',-1) pathId from s_categories 
[...]

Viele Grüße