Vyber dat podle poradi

Michal Krause michal na krause.cz
Pondělí Březen 26 11:21:57 CEST 2001


On 26/03/2001, Karel Zak wrote:

> > Priznam se, ze ted nerozumim. MySQL LIMIT ma, ale nejak mi unika, jak
> > toho v tomto pripade vyuzit? Nebo je to jiny LIMIT?
> 
>  SELECT * FROM xxx ... LIMIT 5 OFFSET 10;
> 
>  vrati vyrez z vysledeku selectu v rozmezi radek 10 az 15.
[snip]
>  Nebo myslis neco jineho?

Jde o to, ze neni znamo, jestli tam bude pet polozek se stejnou hodnotou
(a tim padem stejnym poradim) nebo jenom jedna. LIMIT urcuje vyber
radku podle jejich poradi ve vracenych vysledcich, ale ja nevim, jestli
bude poradi 3 az 5 na pozici 3 az 5 (plati jestlize nebude mit vice
zaznamu stejnou hodnotu).

> > ale nepovedlo se mi to dat dohromady. Zkousel jsem neco jako:
> > 
> > SELECT IF(@prev_val<>hodnota, @pos:=(@pos + 1), @pos), hodnota,
> 
>  Proboha to tam opravdu jde pouzit IF?

Jde.

> 	 ... videl nekdo od MySQL nejaky standard!?

To se neptas toho praveho :)

>  Co treba:	 CASE WHEN ... ELSE .. END

Uf, s vypetim vsech sil se mi povedlo dat dohromady spravnou query.
Vypada takto:

SELECT id, hodnota, CASE WHEN hodnota<@prev_row THEN @pos:=(@pos + 1)
ELSE @pos END, CASE WHEN hodnota<@prev_row THEN @prev_row:=hodnota ELSE
@pos END, @pos, FROM nvdata1 WHERE hodnota>=27 AND hodnota<30 ORDER BY
hodnota DESC;

Pred jejim volanim je nutne nastavit @prev_row na nejakou velmi vysokou
hodnotu.

Diky za tip, CASE WHEN ... je v tomto pripade spravna volba.

S pozdravem
-- 
Michal Krause                                                       /\
ICQ: 7665279            Informace (nejenom) ze sveta Linuxu      /\/  \
email: michal na krause.cz _______ http://www.root.cz/ _______ NAVRCHOLU.cz

Vseci by chceli byt van Goghmi, ale odrezat si ucho ani jeden.
                                                  J. Raz ve filmu Rabaka


Další informace o konferenci Databases