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 22:33 | Komunita

    Ubuntu Cinnamon bude od Ubuntu 23.04 oficiální odnoží Ubuntu (návrh, schválení).

    Ladislav Hagara | Komentářů: 1
    včera 19:22 | Nová verze

    Byla vydána nová major verze 5.0 účetního softwaru GnuCash (Wikipedie). Ve formátu Flatpak je již k dispozici na Flathubu.

    Ladislav Hagara | Komentářů: 0
    včera 18:33 | Nová verze

    Na GOG.com běží Spring Sale. Při té příležitosti lze získat zdarma počítačovou hru Alwa's Awakening (ProtonDB).

    Ladislav Hagara | Komentářů: 0
    včera 16:55 | Nová verze

    Byla vydána verze 3.28.0 2D CAD (computer-aided design) softwaru QCAD (Wikipedie). Přehled novinek v Changelogu.

    Ladislav Hagara | Komentářů: 0
    včera 08:00 | IT novinky

    Změna ve vedení společnosti SUSE. Dosavadní CEO Melissa Di Donato odstoupila. Od 1. května je novým CEO Dirk-Peter van Leeuwen, bývalý Senior Vice President a General Manager ve společnosti Red Hat.

    Ladislav Hagara | Komentářů: 9
    27.3. 22:22 | Nová verze

    CyberChef je webová aplikace pro analýzu dat a jejich kódování a dekódování, šifrování a dešifrování, kompresi a dekompresi, atd. Často je využívaná při kybernetických cvičeních a CTF (Capture the Flag). Vydána byla nová major verze 10 (aktuálně 10.4.0). Přehled novinek v Changelogu.

    Ladislav Hagara | Komentářů: 0
    27.3. 19:22 | Nová verze

    UBports, nadace a komunita kolem Ubuntu pro telefony a tablety Ubuntu Touch, vydala Ubuntu Touch OTA-1 Focal založené na Ubuntu 20.04 Focal Fossa.

    Ladislav Hagara | Komentářů: 1
    27.3. 17:11 | IT novinky

    Společnost Red Hat slaví 30 let.

    Ladislav Hagara | Komentářů: 2
    27.3. 15:22 | IT novinky

    Ve věku 91 let zemřel izraelský informatik Ja'akov Ziv, spolutvůrce bezztrátových kompresních algoritmů LZ77, LZ78 a LZW (Lempel–Ziv–Welch).

    Ladislav Hagara | Komentářů: 0
    27.3. 11:00 | IT novinky

    Byla představena nová Arduino deska Arduino UNO R4 s 32bitovým MCU RA4M1 (Arm Cortex-M4). Desku lze zatím získat pouze v rámci early access programu.

    Ladislav Hagara | Komentářů: 0
    Používáte WSL (Windows Subsystem for Linux)?
     (73%)
     (12%)
     (4%)
     (11%)
    Celkem 358 hlasů
     Komentářů: 7, poslední včera 17:34
    Rozcestník


    Dotaz: SQL dotaz na posledni zaznam vztazeny k uzivateli

    31.3.2016 13:01 RadekXxX | skóre: 8
    SQL dotaz na posledni zaznam vztazeny k uzivateli
    Přečteno: 2595×
    Dobry den, mam tabulku treba knihovna, tam jsou sloupce:

    DatumVypujcky, NazevKnihy, Uzivatel

    potreboval bych sestavit dotaz na to, aby se me vypsaly vsichni uzivatele s posledni vypujcenou knihou (! pouze posledni zaznam od kazdeho uzivatele !). Muzete mi prosim nekdo poradit, jestli to vubec lze bez pouziti nejakych procedur, jedna se o MySQL ?

    Diky za rady

    Řešení dotazu:


    Odpovědi

    31.3.2016 14:10 RadekXxX | skóre: 8
    Rozbalit Rozbalit vše Re: SQL dotaz na posledni zaznam vztazeny k uzivateli
    Tak jsem to vyresil:

    SELECT * FROM Knihovna WHERE DatumVypujcky IN(SELECT MAX(DatumVypujcky) FROM Knihovna GROUP BY Uzivatel)
    31.3.2016 14:34 Filip Jirsák
    Rozbalit Rozbalit vše Re: SQL dotaz na posledni zaznam vztazeny k uzivateli
    Ještě musíte udělat vazbu mezi sloupci Uzivatel toho vnějšího a vnořeného SELECTu. Tohle by vám fungovalo jenom tehdy, kdyby si každý den půjčil jenom jeden uživatel.
    1.4.2016 07:43 RadekXxX | skóre: 8
    Rozbalit Rozbalit vše Re: SQL dotaz na posledni zaznam vztazeny k uzivateli
    Tohto nejak nechapu. DatumVypujcky ma datovy typ DateTime a ty uzivatele by to melo odelit pomoci "GROUP BY Uzivatel". Nebo jak jinak ten dotaz formulovat ? Jeste otestuji. Diky
    1.4.2016 10:03 Filip Jirsák
    Rozbalit Rozbalit vše Re: SQL dotaz na posledni zaznam vztazeny k uzivateli
    Ten vnitřní SELECT vám vrátí, že bylo něco vypůjčeno např. 1. 1. 2016 – a je to pro GROUP BY Uzivatel třeba Franta, ale to ten SELECT nevrací. Vnější SELECT pak najde všechny výpůjčky z 1. 1. 2016. Musíte si z toho vnitřního SELECTu vrátit i toho uživatele. Nevím, zda MySQL podporuje konstrukci (Uzivatel, DatumVypujcky) IN (SELECT …) – pokud ne, musíte to přepsat na JOIN:
    SELECT Knihovna.* FROM Knihovna
    JOIN 
     (SELECT Uzivatel, MAX(DatumVypujcky) AS DatumVypujcky FROM Knihovna GROUP BY Uzivatel) t USING (Uzivatel, DatumVypujcky)
    
    Pořád ale ten SELECT vrátí všechny výpůjčky uživatele v daný den. Pokud chcete jenom jednu výpůjčku, potřebujete mít nějakou sadu údajů Uzivatel+něco, která bude v rámci databáze unikátní, a podle které dokážete určit tu nejnovější výpůjčku – např. ta generovaná ID, jak píše EtDirloth. Pokud ta ID budou unikátní sama o sobě (tj. unikátní bude nejen dvojice Uzivatel,ID, ale i samotné ID), nepotřebujete do toho JOINu přidávat uživatele, protože ten už bude identifikován tím ID.
    1.4.2016 09:43 EtDirloth | skóre: 11
    Rozbalit Rozbalit vše Re: SQL dotaz na posledni zaznam vztazeny k uzivateli
    V tvojom rieseni su dve chyby:
    Po prve vid Filip Jirsák.
    Po druhe, ak nie je DatumVypujcky klucom, tak nebude splnena podmienka "pouze posledni zaznam":
    INSERT INTO Knihovna VALUES ('2016-03-31', 'Dracula', 'RadekXxX');
    INSERT INTO Knihovna VALUES ('2016-03-31', 'Miss Betty', 'RadekXxX');
    INSERT INTO Knihovna VALUES ('2016-03-31', 'The Mystery of the Sea', 'Filip Jirsák');
    INSERT INTO Knihovna VALUES ('2016-04-01', 'The Jewel of Seven Stars', 'Filip Jirsák');
    
    V MySQL by som skusil nejaku agregacnu funkciu - bud min, max, alebo group_concat:
    SELECT k.DatumVypujcky, MIN(k.NazevKnihy) AS NazevKnihy, k.Uzivatel
       FROM Knihovna AS k
       JOIN (SELECT Uzivatel, MAX(DatumVypujcky) AS max_DatumVypujcky
                FROM Knihovna
                GROUP BY Uzivatel
            ) AS g ON (k.Uzivatel = g.Uzivatel AND k.DatumVypujcky = g.max_DatumVypujcky)
       GROUP BY k.Uzivatel, k.DatumVypujcky;
    To vsak bude asi pomale pri vacsich Knihovnach.
    Robustnejsie by bolo vyuzit namiesto MAX(DatumVypujcky) nejaky autoinkrementujuci sa primarny kluc, ktory rastie spolu s datumom, t.j. neINSERTuju sa zaznamy so starsim DatumVypujcky, nez je max(DatumVypujcky) GROUP BY Uzivatel:
    SELECT * FROM Knihovna WHERE id IN (SELECT MAX(id) FROM Knihovna GROUP BY Uzivatel);
    1.4.2016 16:18 logik
    Rozbalit Rozbalit vše Re: SQL dotaz na posledni zaznam vztazeny k uzivateli
    Řešením tohoto jsou tzn. Window funkce - které však MySQL nepodporuje.

    Pokud můžeš (jde o Tvůj vlastní projekt), tak přejdi na Postgres.

    5.4.2016 12:55 Kazatel
    Rozbalit Rozbalit vše Re: SQL dotaz na posledni zaznam vztazeny k uzivateli
    Souhlas s výše uvedeným. Napadlo mě ještě jedno řešení - co takhle udržovat tabulku pouze aktuálních výpůjček? Pokud si nějakou knihu vypůjčí, zapíše se záznam do této tabulky. Pokud se publikace vrátí, pak se z tabulky smaže.

    Tím by mohl být slušně vyřešen performance problém s joinem a max() funkcí.
    xkucf03 avatar 14.5.2016 17:23 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: SQL dotaz na posledni zaznam vztazeny k uzivateli

    Zkus použít DISTINCT ON – prý to funguje i v MySQL.

    Univerzálnějším řešením jsou Window Functions, ale ty v MySQL AFAIK nejsou.

    Pokud není k dispozici ani jedno, jsou potřeba poměrně divoké poddotazy a spojování tabulek1. Pro srovnání:

    [1] pokud máš málo dat a neřešíš rychlost, tak je to použitelné – jinak bych hledal spíš jiné řešení, možná i na úrovni aplikace nebo změny datového modelu…

    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes

    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.