Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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...

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Možno by to šlo aj takto (neskúšal som... :-)): 1. vytvor si UNIQUE index položky ITEM_ID 2. použi p…
pme 10.08.2017 20:58
pme
Ahoj, no vypadá to slibně, akorát jestli nebude problém s tím že v tabulce může být stejné item_id,…
n.u.r.v. 10.08.2017 22:08
n.u.r.v.
Už to komplikuješ...netuším čo je u Teba "tabulka" a čo "zoznam"... pôvodne nesmelo byť rovnaké item…
pme 10.08.2017 22:13
pme
ahoj, zkusím to lépe popsat Jsou dvě tabulky -favorite_list (FL(pk,ai), USER_ID, NAME,...) -favori… poslední
n.u.r.v. 10.08.2017 22:54
n.u.r.v.

ahoj, zkusím to lépe popsat

Jsou dvě tabulky

-favorite_list (FL(pk,ai), USER_ID, NAME,...)
-favorite_list_item (FLI(pk,ai), FL, ITEM_ID, NAME,...)

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:

(FL;USER_ID;NAME)
1;123;Oblíbená auta
2;123;Škodovky

Pak si do obou seznamů přidá nějaké položky- tedy to dabulky favorite_list_item se vloží např.:

první seznam (Oblíbená auta ->FL = 1)
(FLI;FL;ITEM_ID;NAME)
1;1;99999;Renault Megane
2;1;22222;Škoda Superb
3;1;88888;Honda Civic
4;1;44444;Škoda Fabia
a druhý seznam (Škodovky -> FL = 2)
(FLI;FL;ITEM_ID;NAME)
5;2;11111;Škoda citigo
6;2;22222;Škoda Superb
7;2;33333;Škoda Octavia
8;2;44444;Škoda Fabia
9;2;55555;Škoda Yeti

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

(FLI;FL;ITEM_ID;NAME)
1;1;99999;Renault Megane
2;1;22222;Škoda Superb
3;1;88888;Honda Civic
4;1;44444;Škoda Fabia
5;2;11111;Škoda citigo
6;2;22222;Škoda Superb
7;2;33333;Škoda Octavia
8;2;44444;Škoda Fabia
9;2;55555;Škoda Yeti
10;1;11111;Škoda citigo
11;1;33333;Škoda Octavia
12;1;55555;Škoda Yeti

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

Zpět do poradny Odpovědět na původní otázku Nahoru