abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
včera 23:33 | IT novinky

Na Startovači běží kampaň Bulánci se vrací aneb kampaň na podporu vývoje nové verze 2.0 dnes již dvacetileté počítačové hry Bulánci (Wikipedie, YouTube). Požadováno je 500 000 Kč. Aktuálně je vybráno 1 205 835 Kč.

Ladislav Hagara | Komentářů: 1
včera 22:22 | IT novinky

Humble Bundle nabízí balík knih o programování v Pythonu od vydavatelství No Starch Press v digitální podobě bez DRM, a to za zvýhodněnou cenu aspoň 1-15 eur. Akce Humble Book Bundle: Learn You More Python by No Starch Press trvá do 7. června. Znovu je možné rozdělit cenu mezi vydavatele, provozovatele a charitu dle vlastního výběru poté, co se zvedla vlna nevole, když provozovatel tuto možnost omezil.

… více »
Fluttershy, yay! | Komentářů: 0
včera 16:33 | Nová verze

Byla vydána verze 9.2 open source unixového operačního systému NetBSD (Wikipedie). Přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
včera 16:11 | Zajímavý článek

V dubnu loňského roku přešla společnost Cloudflare z reCAPTCHA na hCAPTCHA. Dalším krokem by mělo být úplné zrušení CAPTCHA. Dle aktuálního příspěvku Lidstvo promrhá na CAPTCHA zhruba 500 let denně. Je čas toto šílenství ukončit na blogu Cloudflare by řešením mělo být použití kryptografických tokenů (YubiKey) nebo například rozšíření webových prohlížečů Privacy Pass a systému "Cryptographic Attestation of Personhood" vycházejícího z Web Authentication (WebAuthn) Attestation. Vyzkoušet lze na stránce Cloudflare Challenge.

Ladislav Hagara | Komentářů: 14
včera 13:33 | Zajímavý software

Byl představen projekt Lima aneb Linux-on-Mac ("macOS subsystem for Linux", "containerd for Mac"). Cílem projektu je přinést možnosti WSL (Windows Subsystem for Linux) na macOS [Hacker News].

Ladislav Hagara | Komentářů: 10
15.5. 17:44 | Nová verze

Společnost PINE64 stojící za telefonem PinePhone, notebooky Pinebook a Pinebook Pro, IP kamerou PineCube, hodinkami PineTime, páječkou (pájecím perem) Pinecil, zdroji PinePower nebo RISC-V vývojovou deskou PineCone publikovala na svém blogu květnový souhrn novinek (YouTube). Zmínit lze například prototyp klávesnice k PinePhonu, vybraný název PineDio pro PINE64 LoRA ekosystém nebo Fedora Linux na Pinebooku Pro.

Ladislav Hagara | Komentářů: 18
15.5. 16:33 | Zajímavý software

V prosinci loňského roku byl představen Rizin, fork frameworku pro reverzní inženýrství a analýzu binárních souborů radare2 (r2). Vývojáři Rizinu si vzali s sebou Cutter, do té doby grafickou nadstavbu nad radare2 (r2). Vývojáři radare2 (r2) tedy přejmenovali svou nadstavbu na r2cutter. Dnes je to už ale iaito. Vývojáři se vrátili ke jménu projektu (iaito), ze kterého vznikl Cutter.

Ladislav Hagara | Komentářů: 0
15.5. 09:00 | Nová verze

Byla vydána nová verze 12.0.0 open source webového aplikačního frameworku Angular (Wikipedie). Přehled novinek v příspěvku na blogu.

Ladislav Hagara | Komentářů: 8
14.5. 14:00 | Nová verze

Po osmi letech vývoje byla vydána verze 3 programovacího jazyka Scala (Wikipedie). Přehled novinek v aktualizované dokumentaci.

Ladislav Hagara | Komentářů: 0
14.5. 11:00 | Komunita

O víkendu 15. a 16. května probíhá AlpineConf 2021, tj. online konference vývojářů a uživatelů Alpine Linuxu.

Ladislav Hagara | Komentářů: 0
Transakční aktualizace
 (19%)
 (4%)
 (5%)
 (4%)
 (9%)
 (59%)
Celkem 187 hlasů
 Komentářů: 0
Rozcestník

Dotaz: Smazat radky starsi nez... ale ponechat alespon 3 posledni

16.4. 12:25 tom
Smazat radky starsi nez... ale ponechat alespon 3 posledni
Přečteno: 611×
Zdravim,

mam zhruba nasledujici MySQL tabulku MSG_LOG:
VARCHAR username
TEXT    msg
DATE    created_at
A potreboval bych odmazat zpravy starsi nez 1 mesic, ale ponechat alespon 3 posledni pro kazdy username (i kdyz budou treba starsi nez 1 mesic)

Verim, ze uz to nekdo musel resit, ale asi se googlu spatne ptam :(

Dekuji

Odpovědi

16.4. 17:30 X
Rozbalit Rozbalit vše Re: Smazat radky starsi nez... ale ponechat alespon 3 posledni
Pokud se jedna o jednorazovou akci, tak si nejprve pro kazdeho uzivatele dohledej ID prvnich tri zaznamu starsixh nez jeden mesic a nasledne smaz vsechny zaznamy starsi jeden mesic s vyjimkou ID zaznamu ktere jsi si dohledal predtim..
16.4. 17:33 X
Rozbalit Rozbalit vše Re: Smazat radky starsi nez... ale ponechat alespon 3 posledni
Neco ve smyslu:
DELETE starsi nez mesic EXCEPT (SELECT prvni tri starsi nez mesic pro kazdeho usera);
16.4. 21:17 okbobcz | skóre: 2
Rozbalit Rozbalit vše Re: Smazat radky starsi nez... ale ponechat alespon 3 posledni
Tohle je klasická úloha nalezení top N pro každou skupinu. Korelovaným poddotazem se dá udělat top 1 pro každou skupinu. Ale top n je dost komplikované bez moderního SQL, které je v MySQL až od 8čky. Dá se to udělat jednoduše LATERAL joinem, ještě jednodušeji window funkcemi, a poměrně komplikovaně rekurzivním dotazem. Nejsem si jistý jestli některá z těchto možností byla ve starších verzích MySQL než je nejnovější řada. Ve starších řadách je to možné vyřešit aplikačně nebo uloženou procedurou - skrz iteraci přes kurzor nad uživateli.
19.4. 18:33 EtDirloth | skóre: 11
Rozbalit Rozbalit vše Re: Smazat radky starsi nez... ale ponechat alespon 3 posledni
Trochu nestastne definovane zadanie vzhladom na dve veci:
  • kedze je pouzity typ DATE a predpokladam, ze v jednom dni moze byt viac zaznamov, tak sa tazko urci, ktore 3 z viacerych s rovnakym datumom su tie posledne
  • "ponechat aspon 3" je dost vagne - ale zhodou okolnosti to zjednodusi implementaciu tej query - len jej vysledok nebude deterministicky
ako uz Pavel nadomnou hovoril, v starom mysql chyba podpora korelovanych poddotazov v DELETE - pre mysql 5.6, ktore som skusal na sqlfiddle som prisiel iba na toto:
CREATE TABLE msg_log
(
   username   VARCHAR(100)
 , msg        TEXT(100)
 , created_at DATE
);
CREATE INDEX idx_msg_log_created_at ON msg_log (username, created_at);
INSERT INTO msg_log VALUES ('y', 'A', CURRENT_DATE - interval 6 month);
INSERT INTO msg_log VALUES ('x', 'B', CURRENT_DATE - interval 5 month);
INSERT INTO msg_log VALUES ('x', 'C', CURRENT_DATE - interval 4 month);
INSERT INTO msg_log VALUES ('x', 'D', CURRENT_DATE - interval 4 month);
INSERT INTO msg_log VALUES ('x', 'E', CURRENT_DATE - interval 4 month);
INSERT INTO msg_log VALUES ('x', 'F', CURRENT_DATE - interval 3 month);
INSERT INTO msg_log VALUES ('x', 'G', CURRENT_DATE - interval 2 month);
INSERT INTO msg_log VALUES ('x', 'H', CURRENT_DATE - interval 1 month);
INSERT INTO msg_log VALUES ('x', 'I', CURRENT_DATE - interval 1 day);
INSERT INTO msg_log VALUES ('y', 'J', CURRENT_DATE);
INSERT INTO msg_log VALUES ('z', 'K', CURRENT_DATE - interval 10 month);
INSERT INTO msg_log VALUES ('z', 'L', CURRENT_DATE - interval 9 month);
INSERT INTO msg_log VALUES ('z', 'M', CURRENT_DATE - interval 8 month);
INSERT INTO msg_log VALUES ('z', 'N', CURRENT_DATE - interval 7 month);
INSERT INTO msg_log VALUES ('z', 'O', CURRENT_DATE - interval 6 month);
INSERT INTO msg_log VALUES ('z', 'P', CURRENT_DATE - interval 3 month);

DELETE d
  FROM msg_log AS d
  WHERE d.username = 'z'
    AND d.created_at < (
   SELECT min(x.created_at) min_ts
     FROM (
      SELECT *
         FROM msg_log l
         WHERE l.created_at < CURRENT_DATE - interval 1 month
           AND l.username = 'z'
         ORDER BY l.created_at DESC
         LIMIT 3
   ) x)
;
...a volat to pre kazdeho usera zvlast (v priklade 'z').

tu je kompletny priklad pre PostgreSQL (testovane na 12.6):

CREATE TABLE msg_log
(
   username   VARCHAR
 , msg        TEXT
 , created_at DATE
;
CREATE INDEX idx_msg_log_created_at ON msg_log (username, created_at);

INSERT INTO msg_log VALUES ('y', 'A', current_date - interval '6 month');
INSERT INTO msg_log VALUES ('x', 'B', current_date - interval '5 month');
INSERT INTO msg_log VALUES ('x', 'C', current_date - interval '4 month');
INSERT INTO msg_log VALUES ('x', 'D', current_date - interval '4 month');
INSERT INTO msg_log VALUES ('x', 'E', current_date - interval '4 month');
INSERT INTO msg_log VALUES ('x', 'F', current_date - interval '3 month');
INSERT INTO msg_log VALUES ('x', 'G', current_date - interval '2 month');
INSERT INTO msg_log VALUES ('x', 'H', current_date - interval '1 month');
INSERT INTO msg_log VALUES ('x', 'I', current_date - interval '1 day');
INSERT INTO msg_log VALUES ('y', 'J', current_date);
INSERT INTO msg_log VALUES ('z', 'K', current_date - interval '10 month');
INSERT INTO msg_log VALUES ('z', 'L', current_date - interval '9 month');
INSERT INTO msg_log VALUES ('z', 'M', current_date - interval '8 month');
INSERT INTO msg_log VALUES ('z', 'N', current_date - interval '7 month');
INSERT INTO msg_log VALUES ('z', 'O', current_date - interval '6 month');
INSERT INTO msg_log VALUES ('z', 'P', current_date - interval '3 month');

WITH users AS (
-- idealne mat ulozene v tabulke, na ktoru odkazuje cudzi kluc na msg_log(username)
      SELECT DISTINCT username FROM msg_log
   ), maxDateKeptPerUser AS (
      SELECT u.username, (
         SELECT min(x.created_at)
             FROM (SELECT *
                     FROM msg_log l
                     WHERE l.created_at < CURRENT_DATE - interval '1 month'
                       AND l.username = u.username
                     ORDER BY l.created_at DESC
                     LIMIT 3
                  ) x
         ) AS created_at
         FROM users AS u
   )
DELETE FROM msg_log AS d
   USING maxDateKeptPerUser AS m
   WHERE d.username   = m.username
     AND d.created_at < m.created_at
;

22.4. 09:57 ajtacka
Rozbalit Rozbalit vše Re: Smazat radky starsi nez... ale ponechat alespon 3 posledni
To je otazka jazyka nad tym, napriklad RoR(RUR), z ktoreho ale bola odstranene pokrocilejsie veci v zaujme pokroku, lenze je to ako skrabanie sa lavou nohou za pravym uchom.

Zda sa to neustaly proces, lenze clovek nevie, co si ma o tom mysliet a ako to vyriesit. Ponukaju sa moznosti co s tym, ale ani jedna sa mi nepaci.

Nieco je chybne.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.