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
Některé časteji řešené dotazy pro MySQL - FAQ » Číslování řádků přímo v mysql
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
A nedá se to řešit na straně aplikace?
Dusann
Profil
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 ;
Čítač se nuluje každou vteřinu. Předpokládám, že byste to nepoužívat u jednoho každého dotazu, takže snad by to pro složitější výpisy mělo stačit. Jestli potřebujete kratší čas, koukněte na funkci 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.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: