IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: SQL dotaz na zobrazenie vsetkych clankov autorov, pricom pre kazdeho je nastaveny limit poctu clankov

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Otvorený Zdroj
Tvůrce
Avatar
Otvorený Zdroj:8.9.2020 2:22

Potrebujem, aby sa dalo nastavit limit clankov pre kazdeho autora, a nasledne zobrazit vsetky clanky tychto vybrannych autorov.

napr.:

Zobrazi vsetky clanky od:

PETER (LIMIT 5) -pricom napisal 10 clankov

ALFONS (LIMIT8) -pricom napisal 20 clankov

BOHUMIL (LIMIT 14) pricom napisal 25 clankov

ORDER by DATUM DESC

Zkusil jsem: Skusal som klasicky vyber clankov cez sql podla autora a nasledne vytiahol pomocou php pre konkretneho autora,pomocou cyklov for a foreach ale dopracoval som sa iba pre limit rovnaky pre vsetkych autorov, a potrebujem aby mal konkretny autor nastaveny limit clankov..

Chci docílit: Ak by mal niekto tip alebo aspon popis riesenia.Budem rad ;-) ;-)

Editováno 8.9.2020 2:24
Odpovědět
8.9.2020 2:22
Ak existuje voľná energia, tak autorské právo sú dve smiešne slová..
Avatar
Jan Kerhart
Člen
Avatar
Odpovídá na Otvorený Zdroj
Jan Kerhart:8.9.2020 9:06

Ahoj,
šel bych na to asi nějak takto:

(
        SELECT title, article
        FROM articles
        WHERE user = peter
        LIMIT 5
)
UNION
(
        SELECT title, article
        FROM articles
        WHERE user = alfons
        LIMIT 8
)
UNION
(
        SELECT title, article
        FROM articles
        WHERE user = bohumil
        LIMIT 14
)
ORDER BY date DESC
 
Nahoru Odpovědět
8.9.2020 9:06
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:8.9.2020 10:02

A klidne to muzes udelat i bez union, jednotlivymi dotazy a v cyklu jen menit jmeno a pocet.

 
Nahoru Odpovědět
8.9.2020 10:02
Avatar
Otvorený Zdroj
Tvůrce
Avatar
Otvorený Zdroj:8.9.2020 15:23

No len ako by vyzeral ten cyklus, myslim menit meno a pocet v cyklu :-) ?

Nahoru Odpovědět
8.9.2020 15:23
Ak existuje voľná energia, tak autorské právo sú dve smiešne slová..
Avatar
Jiří Havelka:8.9.2020 21:38

Tady máš nástin jedné z možností, jak by mohl vypadat ten cyklus v php.

/**
 * funkce wacejicí výsledky z db jako pole
 * @return array
 */
function getDbResults(): array {
    // imlmentaci si předpokládám doplníš sám ..
}

$limits = [ // limity pro jenotlivé autory
  'author_1' => 10,
  'author_2' => 20,
  'author_3' => 30,
  'author_4' => 40
];

$results = [];
foreach ($limits as $author => $limit) {
    $sql = 'SELECT * FROM articles WHERE  author = ' . $author . ' LIMIT ' . $limit;
    $results += getDbResults();
}

// dále zpracuji výsledky dle pořeby
 
Nahoru Odpovědět
8.9.2020 21:38
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:9.9.2020 10:15
//    $sql = 'SELECT * FROM articles WHERE  author = ' . $author . ' LIMIT ' . $limit;

    $query = "SELECT * FROM articles WHERE  id_author = %s LIMIT %s";
    $query = sprintf($query,
                        escapeSql($author, 'int'),
                        escapeSql($limit, 'int')
 // coz muze byt: (int) $value, v pripade stringu "'".preg_replace('~[']~', "\\'", $value) . "'"
// ale spravne bys mel pouzit funkce primo z sql driveru, prepare statement nebo na escapovani
                        );

Stacilo by pouzit google, ten je prikladu plny.
A tez by bylo dobre pouzivat spravne nazvy promennych. sql neni totez jako query.

Editováno 9.9.2020 10:17
 
Nahoru Odpovědět
9.9.2020 10:15
Avatar
Otvorený Zdroj
Tvůrce
Avatar
Odpovídá na Peter Mlich
Otvorený Zdroj:10.9.2020 1:34
$sql = 'SELECT * FROM articles WHERE  author = ' . $author . ' LIMIT ' . $limit;

    $query = "SELECT * FROM articles WHERE  id_author = %s LIMIT %s";
    $query = sprintf($query,
                        escapeSql($author, 'int'),
                        escapeSql($limit, 'int')
 // coz muze byt: (int) $value, v pripade stringu "'".preg_replace('~[']~', "\\'", $value) . "'"
// ale spravne bys mel pouzit funkce primo z sql driveru, prepare statement nebo na escapovani
                        );

No len pouzivam PDO z online kurzu MVC cms :-) , autor bude samozrejme id, 'int'

S tymto zapisom sa este nestretol, mam k tomu zopar otazok:

/**
 * funkce wacejicí výsledky z db jako pole
 * @return array
 */
function getDbResults(): array {

// tu bude vystup pole v zapise? napr.

 return $results['clanok_id'];

//alebo ?

echo $results['clanok_id'].'-'.$results['autor_meno'];

}

$limits = [ // limity pro jenotlivé autory
  'author_1' => 10,
  'author_2' => 20,
  'author_3' => 30,
  'author_4' => 40
];

$results = []; //  premenna je pole obdobny zapis by mal byt zrejme: $results=array();
foreach ($limits as $author => $limit) {
    $sql = 'SELECT * FROM articles WHERE  author = ' . $author . ' LIMIT ' . $limit;
    $results += getDbResults();// vygeneruje zaradom vsetky sql dotazy
}

// dále zpracuji výsledky dle pořeby
Nahoru Odpovědět
10.9.2020 1:34
Ak existuje voľná energia, tak autorské právo sú dve smiešne slová..
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:10.9.2020 17:35
$results = []; //  premenna je pole obdobny zapis by mal byt zrejme: $results=array();
foreach ($limits as $author => $limit) {
    $sql = 'SELECT * FROM articles WHERE  author = ' . $author . ' LIMIT ' . $limit;
    $results += getDbResults();// vygeneruje zaradom vsetky sql dotazy
}

//---
$results = array();
foreach ($limits as $author => $limit) {
    $query = 'SELECT * FROM articles WHERE  author = ' . $author . ' LIMIT ' . $limit;
    $results += getDbResults($query);
}

getDbResults($qu­ery) - to bylo podle mne mysleno symbolicky, ani se nenamahal to dopsat. A ty to stejne nahradis vlastnim zpusobem zapisu.

Ja treba ted pouzivam vlastni class WS, ktera vraci array.

   $results += $ws->getArticlesByAuthorId( array('id'=>$author, 'limit'=>$limit) );
// function ($opt=array(), $format=''), format je array, json, xml, csv, txt

Cili, na sql dotazy mam spesl class, a mnohem lepe se pak edituji jako celek v jednom. Navic mi ta class dokaze generovat ruzne formaty, takze vystup muzu zrovna pouzit pro javascript nebo excel (csv) nebo jinam. A soucasne class zkontroluje i opravneni uzivatele. Pak obsahuje prikazy pro nacteni uzivatele z ldap. Cili, nejenom sql. A tez treba ciselniky z textovych souboru a jine.

 
Nahoru Odpovědět
10.9.2020 17:35
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.