k47.cz

MySQL group by trik

autor: kaja47 - CC by - publikováno: - sekce obsah » programování #2427
štítky: a

Představte si, že máme aplikaci jako #stokliku, kde si uživatel může zaznamenávat, kolik udělal kliků.

Data jsou uložena ve dvou jednoduchých tabulkách:

user:     id, name
exercise: userId, date, count

Někde budeme chtít vypsat seznam všech zúčastněných společně s celkovým počtem a maximem kliků. To není žádný problém, bude nám stačit jednoduchý dotaz:

select
  u.name,
  sum(e.count),
  max(e.count)
from user u
join exercise e on e.userId = u.id
group by u.id

Ale teď někdo dostane nápad, že by bylo skvělé, kdyby se ukazovalo i maximum v posledních čtyřech týdnech.

A tady nastává maličký problém.

Pokud dotaz omezíme where datediff(now(), e.date) < 28, pak vypíše jenom data v posledních 4 týdnech. Ale my bychom potřebovali, aby vypsal souhrn všech cvičení a zároveň souhrn za poslední 4 týdny.

Potřebovali bychom něco jako:

select
  u.name,
  sum(e.count),
  max(e.count)
  max(e.count where datediff(now(), e.date) < 28) -- tohle by se nám hodilo
from user u
join exercise e on e.userId = u.id
group by u.id

Ale to v MySQL nejde. Skoro to vypadá, jako bychom se museli uchýlit ke dvěma dotazům.

Právě teď je čas vytáhnout z rukávu jeden trik:

select
  u.name,
  sum(e.count),
  max(e.count)
  max((datediff(now(), e.date) < 28) * e.count) -- magic!
from user u
join exercise e on e.userId = u.id
group by u.id

Kouzlo spočívá v tom, že SQL je věrné tradici céčka a boolovské hodnoty jsou špatně maskované integery. True je ve skutečnosti 1 a false 0.

A to je celé.

Pokud se necítíte dost odvážně, je možné použít o něco příčetnější variantu:

max(if(datediff(now(), e.date) < 28, e.count, 0))

Takhle je možné v jednom dotazu provádět agregace na celých datech a zároveň na jejich libovolných částech.


komentáře RSS

mrsa
20. března 2014 20:08 #1055
mrsa píše…

Čus, díky za super článek :-)

Myslím že MySQL není (co se týká programování) nijak extra složité, tedy není potřeba hodně velkého matematického přemýšlení jako u jiných jazyků, to je právě to co se mi líbí. A jenom to, i v rámci uplatnění, já jsem se zde (i jinde) naučil SQL a pak jsem se vydal do Německa dělal ajťáka :) (http://itprace-nemecko.cz/ – kdyby se chtěl třeba někdo mrknout ;) )

Napište komentář!

 

o autorovi:

další projekty

wyhledawacz fel.log stalkr vtipy.k47.cz k47.shop Zkracovač adres stripbot

tadá

poslední články

Shooting stars
článek | 26. dubna 2017
KAMSSKSR
| 25. března 2017
I should have danced on that Astronautalis concert
hudební článek | 28. února 2017
ASCII blog
| 6. února 2017
Západní země
hudební článek | 2. ledna 2017
Russian Circles stahují kruhy
hudební článek | 7. prosince 2016

poslední komentáře

Rumové deníky
sdf | 20. května 2017
ASCII blog
Severák | 13. února 2017
Post-rocková věda
Severák | 28. ledna 2017
Sedm let post-rocku
kaja47 | 5. listopadu 2016
Sedm let post-rocku
Roman Štec | 1. listopadu 2016
Sedm let post-rocku
Anonym | 1. listopadu 2016

K47i © 2002 - 2017 K. aka Kaja47