Registrace  •  FAQ  •  Pravidla fóra  •  Uživatelské blogy  •  PCTuning.cz  •  Hledat  • Přihlášení
 • Informace o udělených trestech jsou v patřičném důležitém tématu, více viz Pravidla.

Právě je čt 19. říjen 2017, 16:22

Zobrazit příspěvky bez odpovědiZobrazit aktivní témata



Čas je uváděn v UTC + 1 hodina (letní čas)


Odpovědět na téma  [ 4 příspěvků ] 
Autor Zpráva
 Předmět: MySQL - kopírování bez duplicit v rámci jedné tabulky
PříspěvekZaslal v: čt 10. srpen 2017, 20:30 
Žlutá karta Bazar
Žlutá karta Bazar

Založen: 01. duben 2006
Bydliště: Liberec
Nahoru
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:
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...


 Profil  
 Předmět: Re: MySQL - kopírování bez duplicit v rámci jedné tabulky
PříspěvekZaslal v: so 12. srpen 2017, 14:07 
Nováček
Nováček
Obrázek uživatele

Založen: 11. leden 2009
Bydliště: Hradec Králové
Nahoru
Tohle by mělo být nejoptimálnější, ideálně oindexovat patřičné sloupce:

Kód:
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));


 Profil  
 Předmět: Re: MySQL - kopírování bez duplicit v rámci jedné tabulky
PříspěvekZaslal v: so 12. srpen 2017, 17:22 
Žlutá karta Bazar
Žlutá karta Bazar

Založen: 01. duben 2006
Bydliště: Liberec
Nahoru
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


 Profil  
 Předmět: Re: MySQL - kopírování bez duplicit v rámci jedné tabulky
PříspěvekZaslal v: ne 13. srpen 2017, 21:51 
Žlutá karta Bazar
Žlutá karta Bazar

Založen: 01. duben 2006
Bydliště: Liberec
Nahoru
Tak de mě to asi povedlo i s tou podmínkou na max 50 položek:

Kód:
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));


 Profil  
Zobrazit příspěvky za poslední:  Řadit podle  
Odpovědět na téma  [ 4 příspěvků ] 


Čas je uváděn v UTC + 1 hodina (letní čas)


Přejít do sekce:
  

Kdo je přihlášený

Uživatelé procházející si tuto sekci: Žádní registrovaní uživatelé a 3 anonymních


Nemůžete zakládat nová témata v této sekci
Nemůžete odpovídat na příspěvky v této sekci
Nemůžete upravovat své příspěvky v této sekci
Nemůžete mazat své příspěvky v této sekci
Nemůžete připojit přílohy v této sekci

 
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Český překlad - PCT fórum