Autor Zpráva
mattyZEM
Profil
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  
Ovšem hází chybu #1247 - Reference 'pocp' not supported (reference to group function).

Neví někdo, jak toto napsat správně?

Struktura tabulek:
Uživatelé (users)
uid (ID uživatele) | ujmeno (přezdívka uživatele)
Příspěvky (forum_prispevky)
fpid (ID příspěvku) | fpuid (ID uživatele příspěvku) | fpsekce (ID sekce v které je příspěvek)
Témata (forum_temata)
ftid (ID tématu) | ftuid (ID uživatele tématu) | ftsekce (ID sekce v které je téma)
Sekce (forum_sekce)
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 *
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
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 
což už nehází chybu, ale vrací špatný výsledek. Vrací poct = 2, pocp = 2, celkem = 4, ale poct je stoprocentně 1.
Kajman_
Profil *
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
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 *
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
Bylo tam
uid, ujmeno, fpid, ftid
1     mattyZEM     4     3
1     mattyZEM     5     3
Děkuji mnohokrát… Myslel jsem si, že GROUP BY to opraví, ale ten vracel 1 a 1 (příspěvky i témata), což mě zmátlo. Použil jsem tedy distinct a funguje to perfektně, vrací 3, tak jak má.

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.
Toto téma je uzamčeno. Odpověď nelze zaslat.