Autor | Zpráva | ||
---|---|---|---|
ken Profil * |
#1 · Zasláno: 23. 11. 2010, 15:43:14
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 * |
#2 · Zasláno: 23. 11. 2010, 15:59:21
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 * |
#3 · Zasláno: 23. 11. 2010, 17:04:52
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 * |
#4 · Zasláno: 23. 11. 2010, 17:06:27
prostě chci systém řazení jako je například na csfd.cz
|
||
Kajman_ Profil * |
#5 · Zasláno: 23. 11. 2010, 21:09:06
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 * |
#6 · Zasláno: 24. 11. 2010, 15:59:02
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 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 * |
#7 · Zasláno: 25. 11. 2010, 13:36:47
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é. |
||
Časová prodleva: 13 let
|
0