Autor | Zpráva | ||
---|---|---|---|
Kcko Profil |
#1 · Zasláno: 19. 10. 2008, 21:42:37 · Upravil/a: Kcko
SELECT h.id, h.prezdivka, b.*, hrac, SUM( v * 3 ) + SUM( r * 1 ) + SUM( p * -3 ) uspesnost, pts FROM bilance b JOIN hraci h ON b.hrac = h.id WHERE datum BETWEEN '2008-10-19' AND '2008-10-19 23:59:59' GROUP BY hrac ORDER BY uspesnost DESC, pz DESC LIMIT 1 Tento jednoduchy dotaz mi z tabulky vrati nejuspesnejsiho hrace za dnesni den ( 19/10/ 2008). Chci udelat cosi jako maly kalendarik z hernich dnu a ke kazdemu dni vytahnout nejuspesnejsiho hrace, pochopitelne jednim dotazem. Asi bude treba tabulku bilance spojit se sama sebou , kde druhy dotaz bude jako vlastni tabulka, ale bohuzel mi to nejak nejde. Vedel by nekdo ? |
||
TomášK Profil |
#2 · Zasláno: 20. 10. 2008, 01:06:37
SELECT den, hrac, MAX(uspesnost) FROM ( SELECT h.id AS hrac SUM( v * 3 ) + SUM( r * 1 ) + SUM( p * -3 ) uspesnost, pts, DATE(datum) AS den FROM bilance b JOIN hraci h ON b.hrac = h.id GROUP BY den, hrac ) AS t GROUP BY den Myslím, že výsledný dotaz by mohl vypadat přibližně takto. Poddotazem zjistíš úspěšnost všech hráčů v jednotlivých dnech a pak pro každý den vybereš nejlepšího hráče. Chybí mi tam názvy sloupců v hlavním dotazu, zdá se mi rozumné rozepsat b.* na sloupce, které potřebuješ a doplnit to podle toho. Druhým nedostatkem je, že k řazení hráčů v jednom dni používám jen úspěšnost, ne 'úspěšnost' a 'pz'. Napadá mě ošklivé řešení nahradit MAX(uspesnost) výrazem MAX(uspesnost * MAX(pz) + pz). Nelíbí se mi hned z několika důvodů - špatně se rozšiřuje o další kritéria, počítá se něco, co se počítat nemusí, pz a uspesnost nemusí být stejný datový typ, takže se bude navíc převádět... ale je nejjednodušší. O něco komplexnější (a doufám, že funkční :) ) řešení by mohlo být toto: SELECT * FROM ( SELECT @poradi := (@poradi * (@den=den )) + 1 AS poradi, @den := den AS den, hrac, ... FROM ( SELECT h.id AS hrac SUM( v * 3 ) + SUM( r * 1 ) + SUM( p * -3 ) uspesnost, pts, FROM bilance b JOIN hraci h ON b.hrac = h.id GROUP BY den, hrac ) AS t ORDER BY uspesnost, pz ) WHERE poradi=1 |
||
Kcko Profil |
#3 · Zasláno: 20. 10. 2008, 09:27:34 · Upravil/a: Kcko
No funkcni to zatim neni je tam nejak dost chyb ale aspon vidim smer kterym se mam ubirat, snad to nejak dopisu. diky!
Prinejhorsim si CRON ktery 1x denne zjistuje a zapisuje bilanci aby zapocital natvrdo poradi pro konkretni den a pak to bude snadne :-) ale ten dotaz me stejne zajima a zkusim ho dokoumat |
||
Časová prodleva: 1 rok
|
|||
Kcko Profil |
#4 · Zasláno: 26. 10. 2009, 16:35:51 · Upravil/a: Kcko
Omlouvam se za opetovne otevreni topicu.
Nejak jsem si proklikaval svoje temata, a toto jsem uz nevyresil ( pouze aplikacne ). Nezkusil by to nekdo? Pokusil sem se o nejakou ideu, temer by to mohlo fungovat, ale MYSQL rve #1054 - Unknown column 't1.unique_date' in 'where clause' http://pastebin.com/ma24758e Kajmane? :-) |
||
Kcko Profil |
#5 · Zasláno: 27. 10. 2009, 15:06:33
Nikdo nevi nebo nezajima? :) Fakt by me to potesilo :) ( Dotycny ma u me metr piv )
|
||
Kajman_ Profil * |
Možná to bude příšerně pomalé, ale (jen 1 libovolně zvoleného) nejlepšího pro každý den by mohlo zvládnou něco takového...
select t1.date1, (select hrac from bilance where datum >= t1.date1 and datum < t1.date2 group by hrac order by (sum(v) * 3 + sum(r) * 1 + sum(p) *-3) desc, count(*) desc limit 1) nejlepsi_id from (select date(datum) date1, adddate(date(datum), interval 1 day) date2 from bilance group by date(datum)) as t1 Možná by alespoň trošku pomohlo rychosti, kdyby se datum a čas ukládalo každé zvlášť, je-li to akceptovatelné pro ostatní dotazy. Jinak obecné hledání maxima pro nějakou skupinu je ve faq, ale v tomhle případě to možná bude ještě pomalejší než tyto korelované poddotazy. Musíš si to vyzkoušet. |
||
Kcko Profil |
#7 · Zasláno: 29. 10. 2009, 20:41:52
Kajman:
Skvele jako vzdy, sice jsem chtel, jestli lze rovnou vytahnout i jeho bilance, ale napojit tento dotaz opet na tu samou tabulku a ziskat znova bilanci, body atd... (proste cely obsah tabulky) uz nebude tezke. Diky Kajmane |
||
Kcko Profil |
#8 · Zasláno: 30. 10. 2009, 09:41:55 · Upravil/a: Kcko
Takze po finalni uprave tak jak jsem si predstavoval vystup
SELECT h.id, h.prezdivka, b.*, hrac, SUM( v * 3 ) + SUM( r * 1 ) + SUM( p * -3 ) uspesnost, pts FROM bilance b JOIN hraci h ON b.hrac = h.id JOIN ( select t1.datum, (select hrac from bilance where datum = t1.datum group by hrac order by (sum(v) * 3 + sum(r) * 1 + sum(p) *-3) desc, count(*) desc limit 1) nejlepsi_id from (select datum from bilance group by datum ) as t1 ) as t2 ON t2.nejlepsi_id = b.hrac AND t2.datum = b.datum GROUP BY b.datum, b.hrac Kdyby to tedy nekoho zajimalo ( trebas obdobny priklad v jeho aplikaci) PS. Kajmane, pokud sem jeste zavitas, slo by nejakou snadnou upravou menit LIMIT nejlepsich hracu? Staci mi 1 momentalne, ale kdybych potreboval treba 3 |
||
Kajman_ Profil * |
#9 · Zasláno: 31. 10. 2009, 12:07:30
slo by nejakou snadnou upravou menit LIMIT nejlepsich hracu?
Pochybuji, to už by se asi muselo řešit asi s těmi uživatelskými proměnnými, jak psal Tomáš v druhém příspěvku. Ale jednou se tu řešilo, že při group by už to nemusí vždy fungovat. http://diskuse.jakpsatweb.cz/?action=vthread&forum=28&topic=93701 |
||
Kcko Profil |
#10 · Zasláno: 31. 10. 2009, 13:59:09
Kajman:
Jasny, imho je to zbytecne slozite. Ja si muzu poradi nastavit kdyz se mi provadi CRON a pak vsechno toto odpada, jen m to zajimalo. Diky. Zamykam, nic vic neni treba |
||
Časová prodleva: 15 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0