Autor | Zpráva | ||
---|---|---|---|
Dusann Profil |
Je možné v MySQL vytvoriť pomocný column pre result set ktorý sekvenčne zobrazí hodnoty vždy od 1 ?
Ide mi o samostatný SELECT kde by to fungovalo bez akýchkoľvek zásahov mimo tohto statementu - čiže napr. nie s použitím SET @i=0; Nezdá sa mi, že by neexistovala jednoduchá inbuilt funkcia ktorá by toto riešila, ale zatiaľ som ju nenašiel. |
||
Tori Profil |
#2 · Zasláno: 24. 9. 2014, 23:06:26
|
||
Dusann Profil |
select @radek:=@radek+1 rownum, t.* from (select @radek:=0) r, tabulka t
Toto riešenie nebude dobre použiteľné. Bude z toho extrémne neprehľadné a ťažko čitateľné query ak budem chciet pridať inkrementačný column pre result set, ktorý je generovaný cez zložitejšie query a nie len jednoduché 'FROM tabulka t' (pokiaľ nepoužijem VIEW). |
||
Tori Profil |
#4 · Zasláno: 25. 9. 2014, 00:10:13
A nedá se to řešit na straně aplikace?
|
||
Dusann Profil |
#5 · Zasláno: 25. 9. 2014, 00:16:56
To by sa určite dalo, ale zaujíma ma riešenie na úrovni DB.
Rozmýšľam ako to urobiť vlastnou funkciou, ale zatiaľ ma nenapadlo čo mám použiť pre vynulovanie premennej aby to správne fungovalo...chcelo by to nejaký identifikátor podľa ktorého viem, že som už prečítal celý result set alebo niečo podobné...hm |
||
Tori Profil |
Dá se použít vlastní funkce:
delimiter // create function row_number() returns int(5) begin set @old = @new; set @ref = now(); -- na základě této hodnoty se nuluje čítač set @new = case when @new is null then @ref else @new end; set @i = case when @i is null then 0 when @old != @ref then 0 else @i end; set @i = @i+1; set @new = @ref; return @i; end // delimiter ; UUID() (první tři hexa čísla jsou odvozená od timestamp) a případně zkombinovat i s UUID_SHORT() (když ji pustím ve dvou dotazech po sobě, tak její návratové hodnoty na sebe navazují, i pokud mezi dotazy uplyne několik vteřin).
Anebo se dá funkci předávat jako parametr nějaký token generovaný aplikací unikátně pro každý SQL dotaz. Z hlediska číslování by to bylo nejspolehlivější, ale už by to v dotazu nevypadalo pěkně. A dík za inspiraci, dobře jsem se na tom zabavila. :) |
||
Dusann Profil |
Tori: Akurát nerozumiem, prečo vaše riešenie používa až 4 premenné ?
Ale inšpirovala ste ma s tým now(), tak som sa tiež pokúsil z hlavy vymyslieť vlastné riešenie :) Telo funkcie: IF (NOW() > @start) then SET @start = NULL; END IF; IF @start IS NULL THEN SET @counter=0, @start = NOW(); END IF; SET @counter = @counter + 1; RETURN @counter; Zdá sa že to funguje, ale možno že sa ten kód dá ešte zoptimalizovať a zprehľadniť. A v prípade že chceme aby sa čítač vynuloval pre ďalši SELECT ktorý prebehne skôr ako jedna sekunda od posledného, chcelo by to použiť riešenie s väčším časovým rozlíšením ako ste už spomenuli. Inak MySQL 5.6 už milisekundy pri vrátení aktuálneho času podporuje. |
||
Časová prodleva: 10 let
|
0