Autor Zpráva
ken
Profil *
Zdravím, potřebuji pomoc s SQL dotazem, nevím si rady, ani nevím jestli je to řešitelné.
Mám dvě tabulky hodnoceni a data. V tabulce hodnoceni jsou čtyři sloupce: id,id_polozky,id_user,rating. V tabulce data jsou tři sloupce: id, text,id_user kde id_polozky z tabulky hodnoceni je shodne s id z tabulky data to samé id_user.
(počty řádku v tabulkách si nejsou rovny, v tabulce hodnoceni může být několik řádku od několika id_user pro jedno id_polozky)
Takže co potřebuji: nejlépe pomocí jednoho dotazu chci seřadit položky v tabulce data podle průměrného hodnocení(rating) daného id z tabulky hodnoceni...snad jsem to vysvetlil jasně, předem děkuji.
Kajman_
Profil *
Variant je víc, podle konkrétních dat a filtrování ve where může být někdy rychlejší jedno a někdy druhé. Minimálně pro výpis všech bude asi lepší to druhé.
select d.*, avg(h.rating) prumer
from data d left join hodnoceni h on d.id_user=h.id_polozky
group by d.id
order by prumer


select d.*, h.prumer
from data d left join (select id_polozky, avg(h.rating) prumer from hodnoceni group by id_polozky) h on d.id_user=h.id_polozky
order by h.prumer
ken
Profil *
Kajman:
moc díky jen to chtelo trochu upravit
select d.*, h.prumer
from data d left join (select id_polozky, avg(hodnoceni.rating) prumer from hodnoceni group by id_polozky) h on d.id=h.id_polozky
order by h.prumer

ale mám ještě jeden problém, takhle mi to seřadí podle nejlepšího hodnocení jak jsem chtěl, ale zapoměl jsem dodat že to chci seřadit ještě podle počtu hodnotících abych neměl na prvním místě položku která byla sice hodnocena za nejlepší 1, ale pouze jedním uživatelem jen proto že byla přidána dřív.. kdežto druhá položka bude například ta která byla hodnoce za 1 dvěma uživateli
ken
Profil *
prostě chci systém řazení jako je například na csfd.cz
Kajman_
Profil *
Takto by se rating bral v úvahu jen od 10 hodnocení.
select d.*, h.prumer
from data d left join (select id_polozky, avg(rating) prumer from hodnoceni group by id_polozky having count(*)>=10) h on d.id=h.id_polozky
order by h.prumer
ken
Profil *
podle klasického prumeru bych nedosáhl objektivity, proto jsem našel algoritmus který to zváldne, problém je že to neumím zapsat do jednoho sql dotazu. Takže bych chtel zkombinovat toto
podle toho dotazu
select d.*, h.prumer, h.pocet
from data d left join (select id_polozky, avg(rating) prumer, count( h.id_user ) pocet from hodnoceni group by id_polozky) h on d.id=h.id_polozky
order by h.prumer
si vyberu polozky a k nim priradim prumerne hodnoceni.
Z výsledku této tabulky chci vypsat celkový průměr průměrů(celkovy_prumer) daných položek a průměr hlasů(prumer_hlasu) daných položek
no a na závěr chci ke každé položce přiřadit hodnocení podle tohoto vzorce: (( prumer_hlasu * celkovy_prumer ) + ( pocet * prumer ))/( prumer_hlasu + pocet ))
Kajman_
Profil *
Tak si připojte ještě vypočtené celkové hodnoty.
select d.*, h.prumer
from data d
left join (select id_polozky, avg(rating) prumer, count(*) pocet from hodnoceni group by id_polozky) h
  on d.id=h.id_polozky
join (select avg(rating) prumer, count(*) pocet from hodnoceni) celkovy
order by h.prumer*celkovy.prumer ....


Ale myslím, že možná bude potřeba to mít předpočítané, aby odezvy byly i při mnoha řádcích rychlé.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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