Stránka 1 z 1

MySQL - kopírování bez duplicit v rámci jedné tabulky

Napsal: čtv 10. srp 2017, 20:30
od Václav Sedlář
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:

Kód: Vybrat vše

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

Re: MySQL - kopírování bez duplicit v rámci jedné tabulky

Napsal: sob 12. srp 2017, 14:07
od senik88
Tohle by mělo být nejoptimálnější, ideálně oindexovat patřičné sloupce:

Kód: Vybrat vše

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 FLI1
    WHERE FL = 2 
        AND NOT EXISTS (SELECT 1 FROM favorite_list_item FLI2 WHERE FL = 14 AND FLI2.ITEM_ID = FLI1.ITEM_ID));

Re: MySQL - kopírování bez duplicit v rámci jedné tabulky

Napsal: sob 12. srp 2017, 17:22
od Václav Sedlář
jj, díky, zkusím to... ještě k tomu přibyl požadavek pokud seznam do kterého se kopíruji data má méně než 50 položek tedy pokud v tabulce favorite_list_item je méně než 50 položek s CL = 14

Re: MySQL - kopírování bez duplicit v rámci jedné tabulky

Napsal: ned 13. srp 2017, 21:51
od Václav Sedlář
Tak de mě to asi povedlo i s tou podmínkou na max 50 položek:

Kód: Vybrat vše

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 FLI1
    WHERE FL = 2 
        AND 50>(SELECT COUNT(FLI) FROM  favorite_list_item WHERE FL = 14)
        AND NOT EXISTS (SELECT 1 FROM favorite_list_item FLI2 WHERE FL = 14 AND FLI2.ITEM_ID = FLI1.ITEM_ID));