Autor Zpráva
Kcko
Profil

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
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
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
Kcko
Profil
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
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
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
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 *
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
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
Toto téma je uzamčeno. Odpověď nelze zaslat.