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í
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
včera 21:21 | Nová verze Ladislav Hagara | Komentářů: 0
včera 11:44 | Zajímavý projekt

Na Indiegogo byla spuštěna kampaň na podporu herní mini konzole a multimediálního centra RetroEngine Sigma od Doyodo. Předobjednat ji lze již od 49 dolarů. Požadovaná částka 20 000 dolarů byla překonána již 6 krát. Majitelé mini konzole si budou moci zahrát hry pro Atari VCS 2600, Sega Genesis nebo NES. Předinstalováno bude multimediální centrum Kodi.

Ladislav Hagara | Komentářů: 0
včera 00:10 | Nová verze

Byla vydána verze 4.7 redakčního systému WordPress. Kódové označením Vaughan bylo vybráno na počest americké jazzové zpěvačky Sarah "Sassy" Vaughan. Z novinek lze zmínit například novou výchozí šablonu Twenty Seventeen, náhledy pdf souborů nebo WordPress REST API.

Ladislav Hagara | Komentářů: 4
6.12. 12:00 | Zajímavý projekt

Projekt Termbox umožňuje vyzkoušet si linuxové distribuce Ubuntu, Debian, Fedora, CentOS a Arch Linux ve webovém prohlížeči. Řešení je postaveno na projektu HyperContainer. Podrobnosti v často kladených dotazech (FAQ). Zdrojové kódy jsou k dispozici na GitHubu [reddit].

Ladislav Hagara | Komentářů: 26
6.12. 11:00 | Bezpečnostní upozornění

Byly zveřejněny informace o bezpečnostní chybě CVE-2016-8655 v Linuxu zneužitelné k lokální eskalaci práv. Chyba se dostala do linuxového jádra v srpnu 2011. V upstreamu byla opravena minulý týden [Hacker News].

Ladislav Hagara | Komentářů: 2
5.12. 22:00 | Komunita

Přibližně před měsícem bylo oznámeno, že linuxová distribuce SUSE Linux Enterprise Server (SLES) běží nově také Raspberry Pi 3 (dokumentace). Obraz verze 12 SP2 pro Raspberry Pi 3 je ke stažení zdarma. Pro registrované jsou po dobu jednoho roku zdarma také aktualizace. Dnes bylo oznámeno, že pro Raspberry Pi 3 je k dispozici také nové openSUSE Leap 42.2 (zprávička). K dispozici je hned několik obrazů.

Ladislav Hagara | Komentářů: 6
5.12. 06:00 | Zajímavý software

OMG! Ubuntu! představuje emulátor terminálu Hyper (GitHub) postavený na webových technologiích (HTML, CSS a JavaScript). V diskusi k článku je zmíněn podobný emulátor terminálu Black Screen. Hyper i Black Screen používají framework Electron, stejně jako editor Atom nebo vývojové prostředí Visual Studio Code.

Ladislav Hagara | Komentářů: 50
5.12. 06:00 | Zajímavý článek

I letos vychází řada ajťáckých adventních kalendářů. QEMU Advent Calendar 2016 přináší každý den nový obraz disku pro QEMU. Programátoři se mohou potrápit při řešení úloh z kalendáře Advent of Code 2016. Kalendáře Perl Advent Calendar 2016 a Perl 6 Advent Calendar přinášejí každý den zajímavé informace o programovacím jazyce Perl. Stranou nezůstává ani programovací jazyk Go.

Ladislav Hagara | Komentářů: 10
3.12. 16:24 | Nová verze

Byla vydána Mageia 5.1. Jedná se o první opravné vydání verze 5, jež vyšla v červnu loňského roku (zprávička). Uživatelům verze 5 nepřináší opravné vydání nic nového, samozřejmě pokud pravidelně aktualizují. Vydání obsahuje všechny aktualizace za posledního téměř půldruhého roku. Mageia 5.1 obsahuje LibreOffice 4.4.7, Linux 4.4.32, KDE4 4.14.5 nebo GNOME 3.14.3.

Ladislav Hagara | Komentářů: 17
3.12. 13:42 | Pozvánky

V Praze probíhá konference Internet a Technologie 16.2, volné pokračování jarní konference sdružení CZ.NIC. Konferenci lze sledovat online na YouTube. K dispozici je také archiv předchozích konferencí.

Ladislav Hagara | Komentářů: 0
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 789 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

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: 584×
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: 36 | 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: 36 | 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: 36 | 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: 36 | 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: 24
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: 24
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: 36 | 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: 24
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: 36 | 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: 24
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: 24
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.