Autor | Zpráva | ||
---|---|---|---|
mattyZEM Profil |
#1 · Zasláno: 14. 9. 2010, 13:43:39 · Upravil/a: mattyZEM
Dobrý den,
řeším problém ohledně statistik na fóru. Snažím se vytáhnout 2 county (témata, příspěvky) od uživatelů, s pár podmínkami a to: Vybírá se počet témat pouze v sekcích, kde je nastaveno přidávání (fspridavat), kde je sekce zobrazována všem (fsskryt=0 OR fsskryt IS NULL) a kde sekce náleží tématu (fsid=ftsekce) a zároveň -> Vybírá se počet příspěvků pouze v sekcích, kde je nastaveno přidávání (fspridavat), kde je sekce zobrazována všem (fsskryt=0 OR fsskryt IS NULL) a kde sekce náleží příspěvku (fsid=fpsekce). Počet výsledků pak potřebuji sečíst a vypsat ORDER BY (pocp+poct) DESC. Zde je SQL příkaz: SELECT uid, ujmeno, count( fpid ) AS pocp, count( ftid ) AS poct FROM users u LEFT JOIN forum_temata t ON ( u.uid = t.ftuid ) LEFT JOIN forum_prispevky p ON ( u.uid = p.fpuid ) LEFT JOIN forum_sekce s ON ( s.fsid = p.fpsekce ) LEFT JOIN forum_sekce ss ON ( ss.fsid = t.ftsekce ) WHERE ( ss.fsskryt =0 OR ss.fsskryt IS NULL ) AND ( s.fsskryt =0 OR s.fsskryt IS NULL ) AND s.fspridavat =1 AND ss.fspridavat =1 ORDER BY ( pocp + poct ) DESC LIMIT 5 Neví někdo, jak toto napsat správně? Struktura tabulek: Uživatelé (users) uid (ID uživatele) | ujmeno (přezdívka uživatele) fpid (ID příspěvku) | fpuid (ID uživatele příspěvku) | fpsekce (ID sekce v které je příspěvek) ftid (ID tématu) | ftuid (ID uživatele tématu) | ftsekce (ID sekce v které je téma) fsid (ID sekce) | fsskryt (Určení zobrazování určitým skupinám, všem = 0 / NULL) | fspridavat (Počítat příspěvky/témata z této sekce? 0=NE 1=ANO) Předem děkuji. |
||
Kajman_ Profil * |
#2 · Zasláno: 14. 9. 2010, 17:02:07
Možná jen chybí před order by ještě
group by u.uid, u.ujmeno Pokud to nebude stačit, tak bych si dal ještě pomocný sloupce, kde budou součet těch dvou countů a řadil podle toho. |
||
mattyZEM Profil |
#3 · Zasláno: 14. 9. 2010, 19:00:54
Příkaz jsem trochu předělal:
SELECT uid, ujmeno, count( fpid ) AS pocp, count( ftid ) AS poct, ( count( fpid ) + count( ftid ) ) AS celkem FROM users u LEFT JOIN forum_temata t ON ( u.uid = t.ftuid ) LEFT JOIN forum_prispevky p ON ( u.uid = p.fpuid ) LEFT JOIN forum_sekce s ON ( s.fsid = p.fpsekce ) LEFT JOIN forum_sekce ss ON ( ss.fsid = t.ftsekce ) WHERE ( ss.fsskryt =0 OR ss.fsskryt IS NULL ) AND ( s.fsskryt =0 OR s.fsskryt IS NULL ) AND s.fspridavat =1 AND ss.fspridavat =1 AND fphlavni =0 ORDER BY celkem DESC LIMIT 5 |
||
Kajman_ Profil * |
#4 · Zasláno: 14. 9. 2010, 22:38:30
Stále tápu, že tam nemáte group by. Podle podmínek tipuji, že ty součty řádků musí být vždy stejné. Mohly by být jiné, kdyby tam byla někde null hodnota, ale díky podmínkám ve where se tak asi nestane.
Možná jen hledáte count(distinct ftid). |
||
mattyZEM Profil |
#5 · Zasláno: 15. 9. 2010, 13:30:07
Kajman: Když jsem tam dodal GROUP BY uid,ujmeno, házelo to stejný (špatný) výsledek, tj. témat 2, příspěvků 2.
|
||
Kajman_ Profil * |
#6 · Zasláno: 15. 9. 2010, 13:47:45
Musíte si uvědomit, že se spojují všechny řádky se všemi, pokud vyhovují podmínkám. Bez pochopení tohoto základu se těžko něčeho dobereme.
Prostě si vypište SELECT uid, ujmeno, fpid, ftid FROM users u LEFT JOIN forum_temata t ON ( u.uid = t.ftuid ) LEFT JOIN forum_prispevky p ON ( u.uid = p.fpuid ) LEFT JOIN forum_sekce s ON ( s.fsid = p.fpsekce ) LEFT JOIN forum_sekce ss ON ( ss.fsid = t.ftsekce ) WHERE ( ss.fsskryt =0 OR ss.fsskryt IS NULL ) AND ( s.fsskryt =0 OR s.fsskryt IS NULL ) AND s.fspridavat =1 AND ss.fspridavat =1 AND fphlavni =0 Bude tam např. fpid, ftid 1 1 2 1 Když uděláte count(ftid) bez doporučeného distinct vyjde 2 i když jsou čísla tématu stejná! |
||
mattyZEM Profil |
#7 · Zasláno: 15. 9. 2010, 14:32:32 · Upravil/a: mattyZEM
Bylo tam
uid, ujmeno, fpid, ftid 1 mattyZEM 4 3 1 mattyZEM 5 3 Výsledný příkaz vypadá následovně: SELECT ( count( DISTINCT ftid ) + count( DISTINCT fpid ) ) AS celkem, uid, ujmeno FROM users u LEFT JOIN forum_temata t ON ( u.uid = t.ftuid ) LEFT JOIN forum_prispevky p ON ( u.uid = p.fpuid ) LEFT JOIN forum_sekce s ON ( s.fsid = p.fpsekce ) LEFT JOIN forum_sekce ss ON ( ss.fsid = t.ftsekce ) WHERE ( ss.fsskryt =0 OR ss.fsskryt IS NULL ) AND ( s.fsskryt =0 OR s.fsskryt IS NULL ) AND s.fspridavat =1 AND ss.fspridavat =1 AND fphlavni =0 ORDER BY celkem DESC LIMIT 5 Ještě jednou, děkuji. |
||
Časová prodleva: 14 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0