Autor | Zpráva | ||
---|---|---|---|
poustevníček Profil * |
#1 · Zasláno: 11. 1. 2014, 10:14:19
Ahoj všem,
prosím o radu jak upravit následující sql dotaz. Potřebuji aby to smazalo jen podle nejnovějšího záznamu v tabulce zahranicni. Datum vložení je ve sloupci vlozeni typu datetime. Takže by to mělo smazat jen záznam z tabulky pripravujeme podle nejnovějšího záznamu z tabulky zahranicni. Nyní to projíždí celou tabulku zahranicni a maže shody v obou tabulkách. Potřebuji mazat jen nejnovější záznam. DELETE p FROM pripravujeme p INNER JOIN zahranicni z ON p.Contentgroup = z.Contentgroup Děkuji za radu. |
||
Tori Profil |
V INNER JOIN musí být místo tabulky poddotaz, kterým najdete jen nejnovější řádek.
|
||
postevníček Profil * |
#3 · Zasláno: 11. 1. 2014, 10:52:30
Poddotaz? Nevím vůbec jak by měl vypadat.
|
||
Tori Profil |
Pro inspiraci první výsledek na hledání "delete select poddotaz": Problém s poddotazem (ve vašem případě taky vlastně půjde použít poddotaz ve WHERE, nemusí tam být spojování tabulek.)
|
||
postevníček Profil * |
#5 · Zasláno: 11. 1. 2014, 11:37:50
Tohle mě tak nějak napadlo ihned ale nějak nechápu jak v tom poddotazu určit právě jen ten nejnovější záznam
|
||
Alphard Profil |
order by a limit
Jestli nejsou potřeba další podmínky a fungovalo by něco jako max(id) , bude to rychlejší.
|
||
poustevníček Profil * |
#7 · Zasláno: 11. 1. 2014, 11:48:15
Zkusil jsem toto
DELETE FROM pripravujeme WHERE Contentgroup NOT IN (SELECT Contentgroup FROM zahranicni ORDER BY vlozeni)
Ale smazalo mi to bohužel všechno v tabulce pripravujeme |
||
lionel messi Profil |
#8 · Zasláno: 11. 1. 2014, 11:57:32
A čo takto pridať nabudúce aj nejaký ten limit:
DELETE FROM pripravujeme WHERE Contentgroup NOT IN (SELECT Contentgroup FROM zahranicni ORDER BY vlozeni LIMIT 1) |
||
Tori Profil |
DELETE FROM pripravujeme WHERE Contentgroup IN (SELECT Contentgroup FROM zahranicni ORDER BY vlozeni LIMIT 1) edit: Jen pro jistotu: ten limit na jeden (nejnovější) řádek, měl být jen u tabulky zahranicni, nechcete mazat jen jediný řádek z tabulky pripravujeme, pochopila jsem správně? |
||
postevníček Profil * |
#10 · Zasláno: 11. 1. 2014, 11:59:53
Myslim ze limit neni dulezity, kdyz mi to smazalo celou tabulku pripravujeme aniz by to vzalo v potaz nejnovější vložení
|
||
lionel messi Profil |
#11 · Zasláno: 11. 1. 2014, 12:04:13 · Upravil/a: lionel messi
postevníček:
Limit je dôležitý, mal by si si jeho používanie trochu naštudovať. Ja to (hoci len ako začiatočník) chápem tak, že LIMIT mi vždy stanoví množstvo (usporiadaných) záznamov, s kt. chcem pracovať (a to je hlavne v prípade DELETE dosť dôležité).
|
||
poustevníček Profil * |
#12 · Zasláno: 11. 1. 2014, 12:07:08
Tori:
Ten Vás dotaz mi hlásí tuto chybu: #1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' Tedy jen jeden řádek z tabulky pripravujeme. Mám web kde se mi ukazuje jaká alba připravujeme, když je album připravené dát na web, tak nahraju CSV do tabulky zahranicni. Po vykonání uploadu by se měl právě provést dotaz který mi smaže Contentgroup z tabulky pripravujeme právě podle toho co jsem zrovna v CSV nahrál do tabulky zahranicni |
||
juriad Profil |
#13 · Zasláno: 11. 1. 2014, 12:16:08
poustevníček:
A ty snad někdy chceš mít ten samý záznam v tabulce zahraniční i připravujeme? Mě to nedává smysl. Budeš asi muset položit jednodušší dotaz: DELETE FROM pripravujeme WHERE Contentgroup = $id_prave_pridaneho Další informace k tématu (tam jsem mu poradil dotaz v [#1]): Nahraní CSV a následné smazaní z druhé tabulky. |
||
poustevníček Profil * |
#14 · Zasláno: 11. 1. 2014, 12:19:54
[#13] juriad
Právě že nechci, pokud přidám záznam do zahranicni, měl by se smazat dotazem v tabulce pripravujeme. Ten dotaz jsem použil, ale v pripravujeme mám i informace o albech které budu doplňovat už k existujícímu interpretovi. Pokud použiji ten dotaz co jste mi poradil, tak po nahrátí CSV mi to smaže vše co už obsahuje tabulka zahranicni, tedy i ty alba v pripravujeme které budu doplňovat protože už stejný interpret existuje v tabulce zahranicni. |
||
juriad Profil |
Aha, to jsem netušil; snažil jsem se ti ušetřit práci: stačilo by ten dotaz spustit až po naimportování všech záznamů do tabulky zahraniční.
Pokud to chápu správně, tak úloha zní: (Automaticky) smazat záznam z tabulky připravujeme (pokud existuje), kdykoli se provede INSERT do tabulky zahraniční. Záznam ke smazání se pozná (jednoznačně) podle pole Contentgroup. Na toto by mohl být nejlepším řešením TRIGGER v databázi, který bude záznamy mazat automaticky při INSERTu: DELIMITER ;; CREATE TRIGGER smazat_pripraveny AFTER INSERT ON zahranicni FOR EACH ROW BEGIN DELETE FROM pripravujeme WHERE Contentgroup = new.Contentgroup; END;; DELIMITER ; Opraven trigger, aby šel snadno vytvořit pomocí PhpMyAdminu či Admineru. Ten trigger musíš vytvářet pomocí nějakého takového nástroje; a vytvoříš ho jen jednou jedinkrát. |
||
poustevníček Profil * |
#16 · Zasláno: 11. 1. 2014, 12:38:52 · Upravil/a: poustevníček
[#15] juriad
Ano přesně tak, asi jsem to neuměl přesně vysvětlit. Ovšem to co jste mi nyný napsal, hlásí chybu tuto chybu: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5 *nyní U upraveného triggeru tato chyba: #1419 - You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable) |
||
juriad Profil |
#17 · Zasláno: 11. 1. 2014, 12:53:24
Tak se do databáze přihlašuješ pod uživatelem, který nemá oprávnění vytvářet TRIGGERy.
Podle diskuse na http://stackoverflow.com/questions/1627383/cant-create-mysql-trigger-with-trigger-privilege-on-5-1-32 to vypadá, že musíš mít oprávnění SUPER. |
||
poustevníček Profil * |
#18 · Zasláno: 11. 1. 2014, 13:12:44
[#17] juriad
Ok, díky za vše, mám hosting na endoře, zkusím vypátrat jak to tam je. |
||
Kajman Profil |
#19 · Zasláno: 11. 1. 2014, 21:24:43
DELETE FROM p USING pripravujeme p INNER JOIN (SELECT contentgroup FROM zahranicni ORDER BY vlozeni LIMIT 1) z ON p.contentgroup = z.contentgroup |
||
poustevníček Profil * |
#20 · Zasláno: 12. 1. 2014, 12:09:42
Kajman:
Děkuji, tento dotaz také funguje. Prozatím ho použiji, než se endora vymáčkne jak je to s tím triggerem. Mám variantu plus kde je možné vytvářet triggery ovšem nějak jim to nefunguje. |
||
Časová prodleva: 10 let
|
0