Autor Zpráva
teo
Profil *
Zdravím, mám dotaz ohledně řazení položek z DB dle hodnocení. Situace je následující:

V databázi jsou dvě tabulky, v jedné informace o fotografiích a v druhé informace o hodnocení:

fotgrafie: id_fotografie
fotografie

hodnocení: id_hodnoceni
uzivatel
fotografie (cizí klíč k id_fotografie)
hodnoceni

V hodnocení nejsou ohodnoceny všechny fotografie, ale jen některé! A teď chci řadit výpis podle hodnocení a počtu hodnotících. Zkoušel jsem do dotazu doplnit ORDER BY AVG(hodnoceni), ale to mi to pak seřadí podivným způsobem, ale ne správně. Napadlo mě, že nejjednodušší řešení by bylo přidat do tabulky fotografie sloupce hodnocení a hodnotilo, kde by se při každém hodnocení upravil výsledek dle součtu a zprůměrování z tabulky hodnocení, a bylo by snad po problému. Byl bych však radši, kdyby se to sečetlo spojením těch dvou tabulek a ne přidáváním dalších sloupců... Nemáte nějaký osvědčený fígl? Díky za odpovědi
Pavel Strejček
Profil
Použil bych v SQL dotazu JOIN pro spojení výsledků za dvou tabulek a ORDER BY nejaky_vypocet.
teo
Profil *
V dotazu samozřejmě JOIN je. Jinak by bylo naprosto jasné, že to fungovat nebude.
Dotaz vypadá asi takhle:

SELECT id_fotografie, fotografie
FROM fotografie AS f
LEFT JOIN hodnoceni AS h
ON f.id_fotografie = h.fotografie
GROUP BY id_fotografie
ORDER BY AVG(h.hodnoceni)
Pavel Strejček
Profil
Ok, není jasné čeho se přesně týká ten dotaz.

Bylo by dobré, aby to aktuální stav a nebyly zvýhodněny staré fotografie.
Toho je možné dosáhnout například tak, že pro potřeby hlasování se bude počítat součet bodů za posledních x hlasovaní
do y dnů nazpět a řadit podle tohoto součtu.
Pavel Strejček
Profil
(dotazem myslím původní otázku)
teo
Profil *
doba, kdy bylo hodnocení provedeno není v tomto případě vůbec důležitá. Dotaz je jen pro příklad a týká se toho, že chci z DB načíst potřebné fotografie (dotaz je jen zjednodušený, v reálu je mnohem složitější - to ale není podstatné) a ty seřadit od nejlepšího hodnocení po nejhorší - takže dotaz mi vyplivne třeba 10 fotograafií (což je správně), ale neseřadí je podle hodnocení - řadí je chybně.

Ještě pro jistotu, v tabulce hodnocení je například pro fotografii č.1 10 hlasů (tedy deset řádků s různými hlasy) a průměrné hodnocení 2,5, pro fotografii č.2 2 hlasy a průměrné hodnocení 5,65, ..... A já potřebuju, aby ty fotografie vyjeli v pořadí 2, 1 ...... Nic víc nepotřebuju.
Pavel Strejček
Profil
IMHO je ten uvedený SQL dotaz funkčí jak požaduješ až na nejednoznačný název sloupce fotografie za SELECTem.
Pavel Strejček
Profil
Abych byl úplně přesný dal bych tam DESC.
teo
Profil *
DESC nebo ASC už si doplním dle potřeby a samozřejmě, aby bylo vše naprosto v pořádku, tak pak musí být SELECT f.id_fotografie, f.fotografie, to jsem tam zapomněl napsat. Ale i tak se mi to pořád neřadí správně.

Vždy se mi seřadí podle hodnocení 9, 4, 10, 0, 0, 0, 9, .... Což neodpovídá ani ASC ani DESC. Tak nevím...
Pavel Strejček
Profil
Pošli CREATE statement a sample INSERT data jinak je to věštění z křišťálové koule.
teo
Profil *
hotovo, už se mi to podařilo vyřešit... Problém byl nakonec úplně někde jinde... potřeboval jsem, aby průměr byl zaokrouhlen na 2 desetinná místa a omylem jsem tuhle podmínku nakopíroval i do dotazu za order - ORDER BY ROUND(AVG(h.hodnoceni),2) a proto to samozřejmě nefungovalo. Když jsem odmazal ROUND(), tak je vše v pořádku. To je tak, když si chce člověk zrychlit práci kopírováním... že mě to ale potrápilo.

Každopádně díky za rady a hlavně za trpělivost

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: