
MySQL - kopírování bez duplicit v rámci jedné tabulky
Ahoj, potřeboval bych poradit s MySQL dotazem:
V databázi si uživatelé zakládají seznamy kam si ukládají oblíbené položky a proto mám db tabulky favorite_list a favorite_list_item - favorite_list jsou jednotlivé seznamy oblíbených položek a v favorite_list_item pak jednotlivé položky. Uživatel může mít více seznamů.
Struktura tabulek:
favorite_list:
FL(pk), USER_ID, NAME, ...
favorite_list_item:
FLI(pk), FL, ITEM_ID, NAME, URL, DATE_CREATE,...
A teď bych chtěl přidat operaci pro kopírování položek z jednoho seznamu do druhého, ale v seznamu nesmí být stejné položky (item_id) a chtěl bych to udělat pokud možno jedním dotazem, resp. nějak rozumně optimalizovaně.
Zatím jsem vymyslel tento dotaz, ale mám pocit že to není optimální a asi by to šlo lépe, ale zatím netuším jak:
Toto jsem vymyslel a funguje, ale asi to není optimální. FL 2 je seznam ze kterého kopíruji data a FL 14 je cílový seznam
INSERT INTO favorite_list_item(FL, ITEM_ID, NAME, URL, DATE_CREATE)
(SELECT 14 AS FL, ITEM_ID, NAME, URL, DATE_CREATE
FROM favorite_list_item
WHERE FL = 2 AND ITEM_ID NOT IN (SELECT ITEM_ID FROM favorite_list_item WHERE FL = 14));
Díky za radu...
Možno by to šlo aj takto (neskúšal som...
):
1. vytvor si UNIQUE index položky ITEM_ID
2. použi príkaz INSERT IGNORE - duplicity sa budú ignorovať
príklad:
INSERT IGNORE INTO favorite_list_item1 SELECT * from favorite_list_item2;
Ahoj, no vypadá to slibně, akorát jestli nebude problém s tím že v tabulce může být stejné item_id, ale nesmí být ve stejném seznamu, tedy nesmí být víc záznamů se stejným FL a zároveň stejným ITEM_ID
Už to komplikuješ...netuším čo je u Teba "tabulka" a čo "zoznam"... pôvodne nesmelo byť rovnaké item_id, teraz pribudol ďalší stĺpec fl...
Radšej sa vyspi a zajtra to sformuluj nanovo a hlavne zrozumiteľne ! V jednoduchosti je krása.
ahoj, zkusím to lépe popsat
Jsou dvě tabulky
Uživatel (user_id 123) si třeba založí dva seznamy, třeba Oblíbená auta a Škodovky, tedy v tabulce favorite_list se založí tyto záznamy:
Pak si do obou seznamů přidá nějaké položky- tedy to dabulky favorite_list_item se vloží např.:
(pozn. pořád se jedná o tu samou tabulku favorite_list_item)
A teď je to co potřebuji vyřešit - uživatel se rozhodne, že chce zkopírovat druhý seznam do prvního, tedy položky s FL=2 se zduplikují, ale nastaví se jim FL=1 a zároveň se vynechají položky se stejným ITEM_ID a FL=1 tedy se nezkopíruje FLI6 a FLI8 protože už v seznamu 1 jsou...
Tedy finální obsah tabulky favorite_list_item bude:
Výsledkem je že v seznamu FL1 - Oblíbená auta má celkem 7 položek
(když si pak uživatel zobrazuje jednotlivé seznamy, tak se používá dotaz SELECT fl.*,fli.* FROM favorite_list AS fl JOIN favorite_list_item AS fli ON (fli.FL = fl.FL) WHERE fl.FL =? AND fl.USER_ID =?)
Snad už jsem to popsal líp...
Díky