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
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