abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 02:11 | Pozvánky

    Připojte se ve středu 30. 10. 2024 od 10:00 do 12:00 na náš webinář "Řízení přístupu do PostgreSQL prostřednictvím externího autentizačního providera" (registrace zdarma) a naučte se, jak nastavit ověřování pomocí GSSAPI pro bezpečný přístup k databázím (Microsoft Active Directory nebo FreeIPA). Záznam předchozího webináře "Co je nového v PostgreSQL 17" můžete zhlédnout zde.

    … více »
    Heřmi | Komentářů: 0
    včera 21:33 | Nová verze

    Byla vydána nová verze 0.55 open source počítačové hry Unvanquished (Wikipedie), forku počítačové hry Tremulous. Instalovat ji lze také z Flathubu.

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

    Dle plánu bylo dnes vydáno Factorio 2.0 a Factorio: Space Age, tj. aktualizace 2.0 počítačové hry Factorio (Wikipedie) oficiálně běžící také na Linuxu a velké vesmírní rozšíření Factorio: Space Age.

    Ladislav Hagara | Komentářů: 0
    včera 10:33 | Pozvánky

    Byl zveřejněn průběžně aktualizovaný program konference OpenAlt 2024 o otevřeném softwaru a datech, IT bezpečnosti, DIY a IoT. Konference proběhne o víkendu 2. a 3. listopadu v prostorách FIT VUT v Brně. Vstup je zdarma.

    Ladislav Hagara | Komentářů: 0
    včera 07:00 | Komunita

    Ubuntu oslavilo 20 let. První Ubuntu 4.10 s kódovým názvem Warty Warthog bylo vydáno 20. října 2004.

    Ladislav Hagara | Komentářů: 1
    20.10. 04:44 | Nová verze

    Vizuální programovací jazyk MicroBlocks určený pro programování mikropočítačů jako micro:bit pomoci bloků byl vydán v nové verzi 2.0. MicroBlocks je inspirovaný Scratchem.

    Ladislav Hagara | Komentářů: 0
    18.10. 22:44 | IT novinky

    Mapy.cz zavádí placenou verzi Premium (𝕏). Cena předplatného bude zveřejněna v další verzi aplikace (𝕏). Aplikace i web budou dál fungovat zdarma. Mění se způsob ukládání offline map. Nově bude možné bezplatně uložit offline mapu pouze jednoho státu (𝕏).

    Ladislav Hagara | Komentářů: 33
    18.10. 11:44 | Nová verze

    Byla vydána nová verze 8.10 multiplatformní digitální pracovní stanice pro práci s audiem (DAW) Ardour. Pravděpodobně poslední osmičková verze. V průběhu několika měsíců by měla vyjít verze 9.

    Ladislav Hagara | Komentářů: 0
    18.10. 04:22 | Pozvánky

    O víkendu 19. a 20. října lze na brněnském výstavišti v pavilonu A1 navštívit s jednou vstupenkou dvě akce: Maker Faire Brno, "festival plný workshopů, interaktivních činností a především nadšených a zvídavých lidí", a GameDev Connect, "akci určenou pro všechny současné a hlavně budoucí herní vývojáře, kteří touží proniknout do jednoho z nejúžasnějších průmyslů na světě".

    Ladislav Hagara | Komentářů: 0
    18.10. 00:33 | Nová verze

    Asterisk (Wikipedie), svobodná softwarová implementace telefonní ústředny (PBX), byl vydán ve verzi 22.0.0. Přehled novinek v této nové major verzi v oznámení na webu a na GitHubu.

    Ladislav Hagara | Komentářů: 0
    Rozcestník

    Dotaz: MySQL – výběr na základě dat v jiné tabulce

    30.6.2013 11:17 Tref
    MySQL – výběr na základě dat v jiné tabulce
    Přečteno: 1279×
    Dobrý den, mohl by mi, prosím, někdo poradit s tímto? Řekněme, že mám dvě tabulky:
    table1                   table2
    ---------------          -----------------
    id      int              id           int
    /*     sth   */          table1_id    int
                             str2         text
    Data potřebuji pouze z table1, ovšem jen ze řádků, jejichž id odpovídá table1_id. Podmínkou je LIKE %% v str2, nejsnáze asi vysvětleno příkladem:
    table1
    ---------------
    1     /* sth */
    2     /* sth */
    
    table2
    ---------------
    1     1     cat
    2     1     dog
    3     1     horse
    4     2     cat
    5     2     dog
    6     2     elephant
    
    Pokud dotazu předám ca, vrátí se 1 a 2.
    Pokud dotazu předám ca a g, vrátí se taktéž 1 a 2.
    Pokud dotazu předám ca a or, vrátí se 1.
    Pokud dotazu předám ca a abcd, nevrátí se nic. Vstupů v jednom dotazu může být neomezeně a výkon je důležitý (table1 obsahuje přes 160 tisíc řádků, table2 přes 280 tisíc).

    Předem děkuji.


    Řešení dotazu:


    Odpovědi

    wamba avatar 30.6.2013 13:22 wamba | skóre: 38 | blog: wamba
    Rozbalit Rozbalit vše Re: MySQL – výběr na základě dat v jiné tabulce
    no napadá mě použít GROUP_CONCAT
    This would have been so hard to fix when you don't know that there is in fact an easy fix.
    30.6.2013 13:41 Kit
    Rozbalit Rozbalit vše Re: MySQL – výběr na základě dat v jiné tabulce
    SELECT * FROM table1 WHERE
        id IN (SELECT table1_id FROM table2 WHERE str2 LIKE '%orse%') AND
        id IN (SELECT table1_id FROM table2 WHERE str2 LIKE '%at%');
    
    Pokud záleží na výkonu, není vhodné EAV používat.
    30.6.2013 15:33 Tref
    Rozbalit Rozbalit vše Re: MySQL – výběr na základě dat v jiné tabulce
    Děkuji za funkční řešení.
    15.7.2013 09:13 hyperventil
    Rozbalit Rozbalit vše Re: MySQL – výběr na základě dat v jiné tabulce
    1. misto (select ... and select ...) pouzij (like ... or like ...)

    2. v pripade vetsich tabulek timto spolehlive zabijes mysql server. spravne reseni je pouzit join misto subselectu ve where casti.
    rADOn avatar 2.7.2013 17:48 rADOn | skóre: 44 | blog: bloK | Praha
    Rozbalit Rozbalit vše Re: MySQL – výběr na základě dat v jiné tabulce
    SELECT DISTINCT t1.* FROM table1 t1
    JOIN table2 t2 ON t2.table1_id = t1.id
    WHERE 1=1
    AND t2.str LIKE '%whatever%'
    AND t2.str LIKE '%whateverelse%'
    
    Na vykon sere pes… pokud tam mas LIKE %% tak to stejne skonci fullscanem. Jestli se snazis zbastlit si made-by-samodoma fulltext, tak se snazis marne :-)

    "2^24 comments ought to be enough for anyone" -- CmdrTaco
    2.7.2013 22:44 axel
    Rozbalit Rozbalit vše Re: MySQL – výběr na základě dat v jiné tabulce
    Toto urcite nefunguje.
    15.7.2013 15:38 j
    Rozbalit Rozbalit vše Re: MySQL – výběr na základě dat v jiné tabulce
    Toto zcela na 100% funguje a narozdil od tech hruz vejs je to jediny spravny reseni. Jen bych tam pridal left join, pokud je vazba 1:n (pripadne n:n) a ne 1:1.

    Jenom nevim, nac tam davat 1=1 ... ;D.

    A jak bylo receno, libovolnej like ... zabije vykon zcela spolehlive.
    15.7.2013 16:01 Kit
    Rozbalit Rozbalit vše Re: MySQL – výběr na základě dat v jiné tabulce
    Možná to na 100 % funguje, ale zároveň je to 100% špatně, protože to nesplňuje zadání. Přečti si ho ještě jednou a pozorněji.
    rADOn avatar 15.7.2013 19:00 rADOn | skóre: 44 | blog: bloK | Praha
    Rozbalit Rozbalit vše Re: MySQL – výběr na základě dat v jiné tabulce
    1=1 je vzdy true a query optimizer to vyhodi. je to dobry jen k tomu ze kdyz chci zakomentovat prvni podminku za tim tak nemusim odmazavat prebytecne ANDitko a pak zase naopak. ditto kdyz skladas strojove dotaz pro nejaky filtr.
    "2^24 comments ought to be enough for anyone" -- CmdrTaco
    Josef Kufner avatar 16.7.2013 09:16 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: MySQL – výběr na základě dat v jiné tabulce
    Na tohle je lepší používat něco jako je FluentPDO. Tedy přiměřeně chytré lepítko fragmentů do výsledného selectu, které ví, v jakém pořadí je má slepit, takže lze pohodlně přidávat podmínky dle aktuálních potřeb (např. různá dynamická filtrování).
    Hello world ! Segmentation fault (core dumped)
    16.7.2013 10:46 Lyco
    Rozbalit Rozbalit vše Řešení s JOINem
    Jde to i tím JOINem, ale musí se na to jinak:
    SELECT id FROM table1 JOIN t2 ON table1.id = table2.t1_id WHERE 
      str2 LIKE '%ca%' 
      OR str2 LIKE '%or%' 
    GROUP BY t1.id HAVING count(str2) = $count;
    kde $count je počet podmínek (v tomhle případě 2).

    Každopádně souhlasím s předřečníky, že jakmile se používá LIKE '%něco%' tak nemá smysl výkon řešit - tohle bude pomalé pro jakýkoli netriviální počet záznamů, protože se nedá použít index. (Tedy alespoň v MySQL - PostgreSQL umí použít trigramový index, pokud to něco má aspoň 3 znaky. Tam to bude celkem rychlé, ale ten index bude celkem ohromný.)
    Tarmaq avatar 16.7.2013 11:46 Tarmaq | skóre: 39
    Rozbalit Rozbalit vše Re: Řešení s JOINem
    S tim uvedenym joinem to nefunguje spravne. Nepocita totiz s variantou, ze pro jeden zaznam z table1 matchne vice zaznamu v table2. Pro data uvedena v zadani uvadim priklad:
    SELECT t1.id FROM table1 t1
    JOIN table2 t2 ON t1.id = t2.table1_id WHERE
      t2.str2 LIKE '%t%'
    GROUP BY t1.id HAVING count(t2.str2) = 1;
    
    Vrati jen 1, pritom by melo vratit i 2.
    Don't panic!

    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.