Autor | Zpráva | ||
---|---|---|---|
teo Profil * |
#1 · Zasláno: 29. 6. 2007, 17:02:26
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 |
#2 · Zasláno: 29. 6. 2007, 17:26:57
Použil bych v SQL dotazu JOIN pro spojení výsledků za dvou tabulek a ORDER BY nejaky_vypocet.
|
||
teo Profil * |
#3 · Zasláno: 29. 6. 2007, 17:31:25
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 |
#4 · Zasláno: 29. 6. 2007, 17:42:09
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 |
#5 · Zasláno: 29. 6. 2007, 17:47:42
(dotazem myslím původní otázku)
|
||
teo Profil * |
#6 · Zasláno: 29. 6. 2007, 17:58:16
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 |
#7 · Zasláno: 29. 6. 2007, 18:29:58
IMHO je ten uvedený SQL dotaz funkčí jak požaduješ až na nejednoznačný název sloupce fotografie za SELECTem.
|
||
Pavel Strejček Profil |
#8 · Zasláno: 29. 6. 2007, 18:44:43
Abych byl úplně přesný dal bych tam DESC.
|
||
teo Profil * |
#9 · Zasláno: 29. 6. 2007, 18:51:49
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 |
#10 · Zasláno: 29. 6. 2007, 19:08:23
Pošli CREATE statement a sample INSERT data jinak je to věštění z křišťálové koule.
|
||
teo Profil * |
#11 · Zasláno: 29. 6. 2007, 19:17:40
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 |
||
Časová prodleva: 17 let
|
0