Autor Zpráva
kajaman
Profil
Mám tři tabulky: articles(id, name, content, datum), categories(id, name) a articlecategory(articleId, categoryId).
Jeden článek může být v jedné nebo i více kategoriích. Chci vyhledat seznam nejnovějších 5 článků a u každého článku
všechny kategorie, ve kterých je článek zobrazen. Mám to uděláno takto:

// získám seznam posledních 5 článků
$select = "SELECT a.id, a.name, a.content FROM articles a ORDER BY id DESC LIMIT 5";
$results = $db->fetchAll($select);

// získám id těch článků do pole $idList  a pro každý článek si deklaruji pole nazvané podle id, např.  $23 pro článek id 23
$idList = array();
foreach ($results as $item) {
        $idList[] = $item['id'];
        ${$item['id']} = array('categories' => '');                   
}

// získám názvy kategorií pro každý článek
$select = "SELECT ac.articleId, c.name FROM categories c JOIN articlecategory ac ON c.id = ac.categoryid WHERE ac.articleid IN $idList";       
$results2 = $db->fetchAll($select);
         
// a naplním je do předpřipravených polí
foreach ($results2 as $item) {
       ${$item['articleid']}['categories'] .= $item['name'] . ', ';
}
         
//  tato pole potom vložím do pole vybraných pěti poslední článků jako 'categories'
foreach ($results as &$item) {
       $item['categories'] = rtrim(${$item['id']}['categories'], ', ');
}
         
return $results;


Nekomentujte prosím drobné nepřesnosti, jde mi o princip: jde toto vyzobnout z databáze nějak méně komplikovaně? Nebo mám špatně návrh databáze? Předem děkuju za komentáře!
Kajman_
Profil *
Sice to nebude moc velká úspora, ale název kategorie lze tahat jen jednou - tedy dotaz na pět článků, dotaz na kategorie k těmto pěti článkům, dotaz na názvy použitých kategorií. viz.
http://php.vrana.cz/srovnani-dotazu-do-zavislych-tabulek.php

V tomhle konkrétním případě by stačilo group_concat, ale pokud kategorie budou např. klikací, tak už může být lepší a univerzálnější něco takového, jako máte teď nebo co používá Jakub.
kajaman
Profil
OK, díky za vylepšení!

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0