Autor | Zpráva | ||
---|---|---|---|
kajaman Profil |
#1 · Zasláno: 17. 10. 2011, 14:02:55
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 * |
#2 · Zasláno: 17. 10. 2011, 14:43:07
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 |
#3 · Zasláno: 17. 10. 2011, 14:47:34
OK, díky za vylepšení!
|
||
Časová prodleva: 13 let
|
0