Autor | Zpráva | ||
---|---|---|---|
ghost Profil |
#1 · Zasláno: 25. 7. 2011, 01:48:08
Zdarec , potrebuju vypsat 5 nejkomentovanejsich clanku , samozdrejme to mam ve dvou tabulkach clanek a komentar_clanku .
nejde to udelat nejak pomoci jednoho dotazu ? . napadaji me dve moznosti jak to udelat : 1. projit vsechny clanky a ke kazdemu spocitat pocet komentaru a 5 nejvyssich ulozit - tato moznost je priserna, protoze kdyby bylo treba 1000 clanku , tak to bude trvat nehorazne dlouho. 2.vytvorit v tab. clanek sloupec "pocet_komentaru" a pri kazdem vytvoreni , smazani komentare ho dec,inc. vysledny dotaz dam pak ORDER BY pocet_komentaru DESC LIMIT 5 . tato varianta je v pohode , ale musim pridat ten sloupec { pocet_komentaru} navic. proto se ptam , nejde to udelat nejak elegantneji ? (neexistuje nejakej dotaz ktery by to mohl zaridit ? A jestli ne, tak proc ne ? - pardon, koukam u toho na trpaslika :) dik |
||
Alphard Profil |
#2 · Zasláno: 25. 7. 2011, 02:08:46 · Upravil/a: Alphard
Běžně první možnost (bez ukládání, viz dále), samozřejmě na úrovní databáze jedním dotazem. Kdyby to trvalo neúnosně dlouho, tak druhá možnost s tím, že bych aktualizoval třeba cronem, tyto statistiky obvykle nemusí být 100% aktuální.
Nebo to neřešit takhle "nízkoúrovňově", ale cachovat si celý databázový výstup. S moderním frameworkem to není problém, jeden řádek kódu navíc. Když jsem ráno podpořil první možnost, dodatek „a 5 nejvyssich ulozit“ jsem nějak přehlédl, pro vhodný dotaz to bude dost rychlé. Koukám na [#4], něco takového jsem myslel tím jedním dotazem (v [#3] chybí group by, ale join bych osobně preferoval). Jde také o průměrný počet komentářů, tahle konstrukce bude výhodná hlavně pokud je komentářů podstatně víc než článků. |
||
Tirus91 Profil * |
#3 · Zasláno: 25. 7. 2011, 15:34:24
zkusil bych něco takového to.. ale říkám narovinu nevím zda to bude fungovat.
SELECT count(KOM.ID_CLANKU) as celkem FROM CLANEK CLAN RIGHT JOIN KOMENTAR KOM ON KOM.ID_CLANKU=CLAN.ID_CLANKU ORDER BY celkem LIMIT 5 |
||
S Profil * |
#4 · Zasláno: 25. 7. 2011, 21:23:10
select c.* from clanek c, (select id_clanku from komentar_clanku group by id_clanku order by count(*) desc limit 5) t where c.id_clanku = t.id_clanku
|
||
Časová prodleva: 13 let
|
0