| 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: 15 let
|
|||
0