Autor Zpráva
poustevníček
Profil *
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 *
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 *
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 *
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
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)
Pardon, myslela jsem to fakt jen pro ukázka, jak ta syntax vypadá. Nenapadlo mě, že použijete i tu opačnou podmínku.

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 *
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
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 *
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' 
Dotaz by měl mazat záznam z tabulky pripravujeme, podle nejnovějšího záznamu v zahranicni.
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
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
Id právě přidaného záznamu bys měl již znát (právě jsi ho INSERToval).

Další informace k tématu (tam jsem mu poradil dotaz v [#1]):
Nahraní CSV a následné smazaní z druhé tabulky.
poustevníček
Profil *
[#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 ;
Po vytvoření TRIGGERu se o mazání nemusíš starat, bude je provádět sama databáze, jakmile vložíš záznam do tabulky zahraniční.

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 *
[#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
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 *
[#17] juriad
Ok, díky za vše, mám hosting na endoře, zkusím vypátrat jak to tam je.
Kajman
Profil
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 *
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0