Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Mysql db dotaz

Ahoj, potřeboval bych pomoct s mysql dotazem...

Mám tabulku, kde mám (int)FID, (int)UID, (int)WEEK, (int)YEAR,...,

a potřebuji zjistit jedním dotazem minimální týden/rok a maximální týden/rok where FID= and UID =

Tedy když mám např. v tabulce tato data:

1;1;10;2016
1;1;15;2016
1;1;3;2017
1;1;5;2017
1;2;3;2016
1;2;15;2016
1;2;17;2017

a jako parametry FID = 1, UID = 1, tak potřebuji výsledek:

MIN_WEEK->10
MIN_YEAR->2016
MAX_WEEK->5
MAX_YEAR->2017

Problém je, že nevím, jak to udělat jedním dotazem. Díky moc!

Předmět Autor Datum
ten týden/rok si daj dokopy, a bude to jendoduchý select, je nezmysel to mať v dvoch stĺpcoch
čitateľ 04.10.2016 14:12
čitateľ
V pripade, ze je to skolni ukol nebo nemuzes zasahovat do tabulek 1. subselecty, to znamena napr. M…
Jan Fiala 04.10.2016 14:20
Jan Fiala
select MinTyden = MinRokTyden MOD 10000, MinRok = MinRokTyden DIV 10000, ... from ( select MaxRokTyd…
Jan Fiala 04.10.2016 14:26
Jan Fiala
No zatím jsem vyplodil toto: SELECT WEEK(MIN(x.datum)) AS MIN_WEEK, WEEK(MAX(x.datum)) AS MAX_WEEK,…
n.u.r.v. 04.10.2016 14:45
n.u.r.v.
Pokud je to tvoje aplikace, pak to bude mnohem rozumnejsi
Jan Fiala 04.10.2016 14:54
Jan Fiala
Já ji jen dostal na stůl po bývalém vývojáři a teď se přidávají nové fce :-(
n.u.r.v. 04.10.2016 15:02
n.u.r.v.
s trochou predstavivosti sa to da aj jednym selectom :) Opakujuci kod mozes nahradit scalarnou funkc…
wam_Spider007 04.10.2016 16:32
wam_Spider007
Děkuji všem za pomoc, nakonec jsem si dal tu práci překopat app a v db ukládám vždy DATE - z toho zí… poslední
n.u.r.v. 05.10.2016 10:32
n.u.r.v.

V pripade, ze je to skolni ukol nebo nemuzes zasahovat do tabulek

1. subselecty, to znamena napr. Min_Week = (select prikaz)
2. napojis si stejnou tabulku 2x a v podminkach pouzijes select (jednou na max, podruhe na min rok), ale tohle bude krkolomnejsi
3. spojis si rok + tyden ve vnitrnim selectu vyberes a vnejsim selectem zase rozeberes

No zatím jsem vyplodil toto:

SELECT WEEK(MIN(x.datum)) AS MIN_WEEK, WEEK(MAX(x.datum)) AS MAX_WEEK, YEAR(MIN(x.datum)) AS MIN_YEAR, YEAR(MAX(x.datum)) AS MAX_YEAR
FROM (
SELECT STR_TO_DATE(CONCAT(YEAR,'',LPAD(WEEK,2,'00'),' Monday'), '%X%V %W') AS datum
FROM data
WHERE FID =1 AND UID =1
) AS x;

Ale asi to nebude z hlediska výkonu nic moc, takže asi projdu aplikaci a pokud to nebude na překopání celé app, tak to upravím na klasický DATE a při insertu budu převádět WEEK/YEAR (a MONTH/YEAR) na DATE

s trochou predstavivosti sa to da aj jednym selectom :)
Opakujuci kod mozes nahradit scalarnou funkciou :)

select
LEFT(MAX(CONCAT([YEAR], REPLICATE('0', 2 - LEN([WEEK]) ), [WEEK])), 4) MAX_YEAR,
CAST(RIGHT(MAX(CONCAT([YEAR], REPLICATE('0', 2 - LEN([WEEK]) ), [WEEK])), 2) AS INT) MAX_WEEK,
LEFT(MIN(CONCAT([YEAR], REPLICATE('0', 2 - LEN([WEEK]) ), [WEEK])), 4) MIN_YEAR,
CAST(RIGHT(MIN(CONCAT([YEAR], REPLICATE('0', 2 - LEN([WEEK]) ), [WEEK])), 2) AS INT) MIN_WEEK
from data where FID = 1 AND [UID] = 1

Zpět do poradny Odpovědět na původní otázku Nahoru