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 11:33 | IT novinky

    Nový open source router Turris Omnia NG je v prodeji. Aktuálně na Allegro, Alternetivo, Discomp, i4wifi a WiFiShop.

    Ladislav Hagara | Komentářů: 13
    včera 05:44 | Komunita

    Na YouTube a nově také na VHSky byly zveřejněny sestříhané videozáznamy přednášek z letošního OpenAltu.

    Ladislav Hagara | Komentářů: 0
    včera 04:33 | Komunita

    Jednou za rok otevírá společnost SUSE dveře svých kanceláří široké veřejnosti. Letos je pro vás otevře 26. listopadu v 16 hodin v pražském Karlíně. Vítáni jsou všichni, kdo se chtějí dozvědět více o práci vývojářů, prostředí ve kterém pracují a o místní firemní kultuře. Můžete se těšit na krátké prezentace, které vám přiblíží, na čem inženýři v Praze pracují, jak spolupracují se zákazníky, partnery i studenty, proč mají rádi open source a co

    … více »
    SUSEMAS | Komentářů: 1
    včera 04:22 | Komunita

    Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za říjen (YouTube).

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

    Jeff Quast otestoval současné emulátory terminálu. Zaměřil se na podporu Unicode a výkon. Vítězným emulátorem terminálu je Ghostty.

    Ladislav Hagara | Komentářů: 10
    3.11. 22:55 | IT novinky

    Amazon bude poskytovat cloudové služby OpenAI. Cloudová divize Amazon Web Services (AWS) uzavřela s OpenAI víceletou smlouvu za 38 miliard USD (803,1 miliardy Kč), která poskytne majiteli chatovacího robota s umělou inteligencí (AI) ChatGPT přístup ke stovkám tisíc grafických procesů Nvidia. Ty bude moci využívat k trénování a provozování svých modelů AI. Firmy to oznámily v dnešní tiskové zprávě. Společnost OpenAI také nedávno

    … více »
    Ladislav Hagara | Komentářů: 5
    3.11. 16:22 | Pozvánky

    Konference Prague PostgreSQL Developer Day 2026 (P2D2) se koná 27. a 28. ledna 2026. Konference je zaměřena na témata zajímavá pro uživatele a vývojáře. Příjem přednášek a workshopů je otevřen do 14. listopadu. Vítáme témata související s PostgreSQL či s databázemi obecně, a mohou být v češtině či angličtině.

    TomasVondra | Komentářů: 0
    3.11. 13:22 | Nová verze

    Byl vydán Devuan 6 Excalibur. Přehled novinek v poznámkách k vydání. Kódové jméno Excalibur bylo vybráno podle planetky 9499 Excalibur. Devuan (Wikipedie) je fork Debianu bez systemd. Devuan 6 Excalibur vychází z Debianu 13 Trixie. Devuan 7 ponese kódové jméno Freia.

    Ladislav Hagara | Komentářů: 4
    3.11. 10:44 | IT novinky

    Společnost Valve aktualizovala přehled o hardwarovém a softwarovém vybavení uživatelů služby Steam. Podíl uživatelů Linuxu poprvé překročil 3 %, aktuálně 3,05 %. Nejčastěji používané linuxové distribuce jsou Arch Linux, Linux Mint a Ubuntu. Při výběru jenom Linuxu vede SteamOS Holo s 27,18 %. Procesor AMD používá 67,10 % hráčů na Linuxu.

    Ladislav Hagara | Komentářů: 1
    3.11. 10:33 | Zajímavý projekt

    Joel Severin v diskusním listu LKML představil svůj projekt linuxového jádra ve WebAssembly (Wasm). Linux tak "nativně" běží ve webovém prohlížeči. Potřebné skripty pro převod jsou k dispozici na GitHubu.

    Ladislav Hagara | Komentářů: 2
    Jaké řešení používáte k vývoji / práci?
     (36%)
     (48%)
     (18%)
     (18%)
     (22%)
     (16%)
     (21%)
     (16%)
     (17%)
    Celkem 309 hlasů
     Komentářů: 15, poslední 2.11. 08:25
    Rozcestník

    Dotaz: Jak vypsat více řádků z mysql jedním dotazem

    15.5.2014 21:35 KK
    Jak vypsat více řádků z mysql jedním dotazem
    Přečteno: 829×
    Ahoj, mám takový menší problém, v php mám pole
    $dis = array('a', 'b', 'c');
    a chtěl bych pomocí PDO vypsat řádky z mysql za podmínek když dejme tomu, že v poli budou tři hodnoty a,b,c:
    name = a, b, c
    a
    sign = 0, 1, 2
    ale nevím jak na to
    $stmt = $pdo->prepare('SELECT * FROM data WHERE name = ? sign = ?;');
    $stmt->execute(array(???, ???));
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP);
    čili první řádek
    name = a AND sign = 0
    druhý řádek
    name = b AND sign = 1
    třetí řádek
    name = c AND sign = 2
    poradí někdo? Děkuji

    Odpovědi

    15.5.2014 21:43 Kit | skóre: 46 | Brno
    Rozbalit Rozbalit vše Re: Jak vypsat více řádků z mysql jedním dotazem
    SELECT * FROM data WHERE name = ? ORDER BY sign;
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    15.5.2014 21:50 KK
    Rozbalit Rozbalit vše Re: Jak vypsat více řádků z mysql jedním dotazem
    To jsem ten dotaz položil tak moc k nepochopení, že jsi mi napsal takovou odpověď?
    15.5.2014 21:53 Kit | skóre: 46 | Brno
    Rozbalit Rozbalit vše Re: Jak vypsat více řádků z mysql jedním dotazem
    Ten SQL dotaz vybere všechny tři řádky v pořadí 0, 1, 2. Splňuje zadání.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    15.5.2014 22:05 KK
    Rozbalit Rozbalit vše Re: Jak vypsat více řádků z mysql jedním dotazem
    Tak pak jsem to asi blbě napsal... Zkusím to jinak. Místo těchto tří sql dotazů potřebuji jeden společný. sign není číslo řádku v mysql, ale hodnota sloupce s názvem sign.
    SELECT * FROM data WHERE name = a sign = 0;
    SELECT * FROM data WHERE name = b sign = 1;
    SELECT * FROM data WHERE name = c sign = 2;
    
    15.5.2014 22:31 Kit | skóre: 46 | Brno
    Rozbalit Rozbalit vše Re: Jak vypsat více řádků z mysql jedním dotazem
    Nejlépe asi ty tři záznamy ((a, 0), (b, 1), (c, 2)) nacpat do dočasné tabulky a udělat JOIN.

    Jinak se to dá napsat i takto:
    SELECT * FROM data WHERE
        (name = ? AND sign = ?) OR
        (name = ? AND sign = ?) OR
        (name = ? AND sign = ?);
    
    ...
    $stmt->execute(array(a, 0, b, 1, c, 2));
    
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    15.5.2014 22:34 KK
    Rozbalit Rozbalit vše Re: Jak vypsat více řádků z mysql jedním dotazem
    Děkuji, a když nebudu znát počet hodnot/prvků nebo co to je v tom poli $name ?
    15.5.2014 22:41 Kit | skóre: 46 | Brno
    Rozbalit Rozbalit vše Re: Jak vypsat více řádků z mysql jedním dotazem
    Tak přijde na řadu dočasná nebo virtuální tabulka a JOIN.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    15.5.2014 22:56 DarkKnight | skóre: 26
    Rozbalit Rozbalit vše Re: Jak vypsat více řádků z mysql jedním dotazem
    nebo ten dotaz muzes vytvorit na strane php (pokud pocet $name a $sign bude stejny), nejak takhle
    
    $name = array('a','b','c','d');
    $sign = array(1,2,3,4);
    
    
    $query = "SELECT * FROM data";
    $params = array();
    for($i=0;$i< count($name);$i++){
      if($i>0){
        $query .= " OR";
      }else{
        $query .= " WHERE";
      }
      $query .= " (name = ? AND sign = ?)";
    
      $params[] = $name[$i];
      $params[] = $sign[$i];
    }
    
    
    //print $query;
    
    $stmt = $pdo->prepare($query);
    $stmt->execute($params);
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP);
    
    


    tady je samozrejme treba osetrit, zda ma $name a $sign stejne delky (a pripadne ochranu pro prazdne pole -> ted to vypise vse)
    15.5.2014 23:12 KK
    Rozbalit Rozbalit vše Re: Jak vypsat více řádků z mysql jedním dotazem
    Děkuji, ale tohle musím pořádně nastudovat, vůbec nevím wocogo...
    15.5.2014 23:23 DarkKnight | skóre: 26
    Rozbalit Rozbalit vše Re: Jak vypsat více řádků z mysql jedním dotazem
    zakladni prikaz je $query = "SELECT * FROM data";
    za ten je treba pridat podminky, tedy (name = hodnota AND sign = hodnota), jelikoz tam ma byt nebo, pridava se mezi vice podminek spojka OR, tady se pak musi osetrit spravne generovani dotazu

    ten cyklus dela toto (po cyklu si muzete vypsat promennou $query, at vidite, co v ni je)
    $params = array(); // nova promenna -> pole hodnot, ktere budeme bindovat
    for($i=0;$i< count($name);$i++){ // od nuly po delku pole (indexy zacinaji od nuly)
      if($i>0){ // druha az Nta podminka, tak pridame spojku OR
        $query .= " OR";
      }else{ // je to prvni podminka, tak musime pridat WHERE
        $query .= " WHERE";
      }
      $query .= " (name = ? AND sign = ?)"; // zakladni struktura podminky, pro osetreni parametru (prepared statements) dame ?
    
      // a promenne pridame do pole hodnot, prvni je name, druhe je sign -> dva otazniky, dve nove hodnoty
      $params[] = $name[$i];
      $params[] = $sign[$i];
    }


    samozrejme za predpokladu, ze ty hodnoty v $name a $sign jsou validni (na nultem indexu $sign je odpovidajici hodnota k nultemu indexu v $name)
    plus me tak jeste napada, ze by se count($name) mohlo hodit do promenne mimo cyklus (z hlavy netusim, jestli to ma php nejak optimalizovane)
    15.5.2014 23:43 Kit | skóre: 46 | Brno
    Rozbalit Rozbalit vše Re: Jak vypsat více řádků z mysql jedním dotazem
    Lépe se pracuje s tabulkami, které jsou po řádcích:
    <?php
    $rows = array(
        array('a', 0),
        array('b', 1),
        array('c', 2),
        array('d', 3),
    );
    
    $sql = "SELECT * FROM data WHERE " .
        implode(' OR ', array_map(function ($a) {
            return '(name = ? AND sign = ?)';
        },
            $rows)
    );
    echo $sql, "\n";
    
    $params = array();
    foreach($rows as $row){
        $params[] = $row[0];
        $params[] = $row[1];
    }
    print_r($params);
    
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    16.5.2014 09:13 DarkKnight | skóre: 26
    Rozbalit Rozbalit vše Re: Jak vypsat více řádků z mysql jedním dotazem
    to samozrejme, ale musis mit data v takovem formatu... rezie konverze asi bude vetsi, nez to zpracovat v puvodnim formatu (a ten implode s array_map asi taky bude celkem narocny)

    nicmene z informaci z prispevku nize by to slo udelat asi jeste lepe (je jenom jedno pole jmen, sign je odpovidajici index)
    $names = array('a','b','c','d');
    $params = array();
    
    foreach($names as $key => &$item){
            $params[] = $item;
            $params[] = $key;
            $item = "(name = ? AND sign = ?)";
    }
    
    $sql = "SELECT * FROM data WHERE ".implode(' OR ', $names);
    
    echo $sql, "\n";
    print_r($params);
    
    17.5.2014 12:48 Kit | skóre: 46 | Brno
    Rozbalit Rozbalit vše Re: Jak vypsat více řádků z mysql jedním dotazem
    Kupodivu funkce implode() a array_map() jsou méně náročné než cyklus.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    15.5.2014 21:56 DarkKnight | skóre: 26
    Rozbalit Rozbalit vše Re: Jak vypsat více řádků z mysql jedním dotazem
    pouzij operator IN -> WHERE sign IN (?,?,?) (pro dynamicky pocet hodnot iteruj dane pole $dis a vytvor ten retezec), hodnoty pak nabinduj (nebo predej v execute)
    15.5.2014 22:10 KK
    Rozbalit Rozbalit vše Re: Jak vypsat více řádků z mysql jedním dotazem
    Jako takto?
    $ot = array('?', '?', '?');
    $name = array('a', 'b', 'c');
    $sign = array('0', '1', '2');
    
    $stmt = $pdo->prepare('SELECT * FROM data WHERE name IN($ot) AND sign IN($ot);');
    $stmt->execute(array($name, $sign));
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP);
    15.5.2014 22:40 DarkKnight | skóre: 26
    Rozbalit Rozbalit vše Re: Jak vypsat více řádků z mysql jedním dotazem
    ne, nejak takhle
    $ot = "?, ?, ?";
    $name = array('a', 'b', 'c');
    $sign = array('0', '1', '2');
    
    $stmt = $pdo->prepare('SELECT * FROM data WHERE name IN($ot) AND sign IN($ot);');
    $stmt->execute(array_merge($name, $sign));
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP);
    


    nicmene ted mi prijde, ze jsem to pochopil spatne... ma to tedy vypsat hodnoty WHERE (name = 'a' AND sign = '0') OR (name = 'b' AND sign = '1') OR (name = 'c' AND sign = '2'), nebo to ma vypsat hodnoty, ktere obsahuji name = a-c, a/nebo sign = 0-2
    15.5.2014 22:49 KK
    Rozbalit Rozbalit vše Re: Jak vypsat více řádků z mysql jedním dotazem
    No pokud bude mít pole $name 3 prvky, tak potřebuji vrátit z mysql tři řádky a to ty, které budou odpovídat podmínce
    name = 'a' AND sign = '0'
    name = 'b' AND sign = '1'
    name = 'c' AND sign = '2'
    Pkud bude v poli prvků 10, tak vrátit deset řádků z mysql. name a sign jsou názvy sloupců, přičemž hodnoty v poli $name se mění ale druhá podmínka pro sloupec sign je vždy pozice prvku v poli $name. Snad jsem to napsal k pochopení :-(
    16.5.2014 01:02 Sten
    Rozbalit Rozbalit vše Re: Jak vypsat více řádků z mysql jedním dotazem
    name a sign jsou názvy sloupců, přičemž hodnoty v poli $name se mění ale druhá podmínka pro sloupec sign je vždy pozice prvku v poli $name
    Takže sign je unikátní klíč a pro každé sign je právě jedno name (array($sign => $name))? Pak stačí WHERE sign IN (0, 1, 2).
    16.5.2014 09:03 Filip Jirsák
    Rozbalit Rozbalit vše Re: Jak vypsat více řádků z mysql jedním dotazem
    Normálně by se to řešilo dotazem
    SELECT * FROM data WHERE (name, sign) IN (?, ?);
    
    K tomuto dotazu byste pak připojil pole dvojic array(array('a', 0), array('b', 1), array('c', 2)).

    Pokud vím, MySQL ale tuhle syntaxi nepodporuje. Některé frameworky to v takovém případě řeší tak, že ten dotaz sestaví samy. Tj. spočítají počet prvků pole, a podle toho pak vytvoří
    SELECT * FROM data WHERE (name = ? AND sign = ?) [OR (name = ? AND sign = ?)…];
    
    Pokud MySQL tu syntaxi s vektorem v IN nepodporuje, asi budete muset použít to vytváření dotazu na míru. Pozor také na to, že počet položek v IN může být omezený. Ale nedává smysl, abyste tam měl stovky položek, to by pak vypadalo spíš na špatný návrh aplikace, kdy si předáváte nějaké hodnoty přes aplikaci, místo abyste použil JOIN.

    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.