Autor Zpráva
kolooo
Profil *
Ahojte, mam nasledovny problem:

uzivatelia mozu hodnotit clanky od 1 do 7 bodov, pricom 7 je najviac.
Tieto hodnotenia si aj s datumom ukladam do samostatnej tabulky a vzdy celkove
hodnotenie aktualizujem aj v tabulke s clankom.

Ale ja by som chcel teraz spravit ze vypisat 5 najlepsie hodnotenych clankov
za poslednych 7 dni s tym, ze clanok musel hodnotit aspon 3 ludia, aby to
malo nejaku kvalitu.

Vedeli by ste mi prosim vas poradit nejaky vhodny select, s ktorym to dokazem?

Vopred velmi pekne dakujem.
Keeehi
Profil
SELECT * FROM tabulka WHERE count(id_clanku) >= 3 GROUP BY id_clanku ORDER BY sum(hodnoceni) LIMIT 5
TomášK
Profil
Keeehi:
To nebude fungovat, WHERE část se vyhodnocuje před GROUP BY, nelze tam použít COUNT(). Následující dotaz by měl být ke správnému výsledku blíž, ale nezkoušel jsem ho.

SELECT 
    * 
FROM 
    clanky 
    JOIN hodnoceni ON hodnoceni.clanek_id = clanky.id  
WHERE hodnoceni.created_at >= '2011-05-15' 
GROUP BY clanky.id 
HAVING count(*) >= 3 
ORDER BY sum(id_clanku) 
LIMIT 5
kolooo
Profil *
TomášK:
Dakujem, ale kde je nejaka znamka o tych bodoch?
Nerozumiem co spravi sum(id_clanku).

Ale este taky detail, ze hodnotenie clanku je SUMA/pocet_hlasujucich,
a podla toho by som to chcel utriedit.

Da sa to?

Dakujem za Vase rady.
Keeehi
Profil
kolooo:
Ale este taky detail, ze hodnotenie clanku je SUMA/pocet_hlasujucich,
ORDER BY sum(hodnoceni) /count(*)

- ale toto není ta nejlepší metoda
Je rozdíl, jestli článek má 1000x 7 bodů a 1x 6 bodů, nebo 3x 7 bodů. A to, že ten druhý by měl být na vrcholu mezi články mi přirozené nepřijde.
http://www.evanmiller.org/how-not-to-sort-by-average-rating.html
kolooo
Profil *
Nefunguje mi to :(

SELECT 
    * 
FROM 
    clanky 
    JOIN hodnoceni ON hodnoceni.clanek_id = clanky.id  
WHERE hodnoceni.created_at >= '2011-05-15' 
GROUP BY clanky.id 
HAVING count(*) >= 3 
ORDER BY sum(hodnoceni) /count(*)
LIMIT 5



na HAVING count(*) >= 3 mi pise nieco take cervene, ze sa mu tam nieco nepaci.
Kde moze byt chyba?
Kajman_
Profil *
Vypište to take cervene.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0