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

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
Odpovědět
Václav Sedlář
Žlutá karta Bazar
Žlutá karta Bazar
Registrován: 01. dub 2006
Bydliště: Liberec
Kontaktovat uživatele:

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

Příspěvek 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...
senik88
Začátečník
Začátečník
Uživatelský avatar
Registrován: 11. led 2009
Bydliště: Všestary
Kontaktovat uživatele:

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

Příspěvek 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));
Intel Core i7-4930k + SilentiumPC Grandis 2 | Gigabyte GA-X79-UP4 | Kingston HyperX 16 GB DDR3 1866 MHz (4x4 GB) | AMD Radeon RX Vega 56 + Raijintek Morpheus II | SSD Intel 520 240 GB + Crucial MX300 1TB | Corsair HX620 | Fractal Design Define R6 | HP LP2475w + HP ZR22w | HyperX Alloy FPS Pro | Gigabyte M8000X
Václav Sedlář
Žlutá karta Bazar
Žlutá karta Bazar
Registrován: 01. dub 2006
Bydliště: Liberec
Kontaktovat uživatele:

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

Příspěvek 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
Václav Sedlář
Žlutá karta Bazar
Žlutá karta Bazar
Registrován: 01. dub 2006
Bydliště: Liberec
Kontaktovat uživatele:

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

Příspěvek 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));
Odpovědět

Zpět na „Programování a web“