Autor | Zpráva | ||
---|---|---|---|
ninja Profil |
#1 · Zasláno: 4. 7. 2012, 16:20:38
V první tabulce mám dva sloupce s datumem (from, till) a další údaje. Opakovaně musím přenášet data do jiné tabulky, kde se ukladá na každý řádek jeden den z daného rozsahu (insert/update). Jak na tuto úlohu co nejlépe, ideálně bez přenosu dat do aplikace a zpět?
Příklad: tabulka 1 ID FROM TILL DATA 1 2012-01-04 2012-01-06 XXX 2 2012-01-06 2012-01-07 ZZZ tabulka 2 DATE DATA 2012-01-04 XXX 2012-01-05 XXX 2012-01-06 XXXZZZ 2012-01 07 ZZZ Aktuálně to jede na MySQL 5, ve finále na Google BigQuery, tedy čím jednoduší a nepropriatární SQL příkazy tím lépe. |
||
Kajman Profil |
#2 · Zasláno: 4. 7. 2012, 17:16:35
Pomohla by pomocná tabulka s kalendářem. Tedy mít další přednachystanou tabulku (pro jiné aplikace se může hodit označení svátku atp.), kde budou všechny potřebné dny. Pak se jednoduchým joinem dají zjistit data pro tabulku 2.
|
||
ninja Profil |
#3 · Zasláno: 4. 7. 2012, 18:07:25
Ano. V současnosti používám tuto šílenost, kde se to generuje on-the-fly:
SELECT a.date, tabulka.profile_id, tabulka.data FROM tabulka LEFT JOIN ( select '2012-01-01' + INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as date from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c) a ON a.date BETWEEN tabulka.startdate AND tabulka.enddate GROUP BY a.date, tabulka.id Rychlost dotazu samozřejmě nejvíce závisí na počtu data v tabulka (v reálu doatazuji jen jejich část). Je zajímavé, že tabulku váži na a přes JOIN a ne LEFT JOIN, dotaz trvá řádově déle, rptože musí pocházet celou tabulku a dělá Range search... |
||
Kajman Profil |
#4 · Zasláno: 4. 7. 2012, 19:57:30
Myslím, že s pomocnou kalendářovou tabulkou to bude rychlejší, tam to nemusí nic počítat a může využít indexy. A výsledný sql bude určitě jednotnější napříč databázemi.
|
||
Časová prodleva: 11 let
|
0