Numerowanie wierszy tabeli i związany z nim kłopot

0

Tak międzyczasie szukam odpowiedzi na następuący problem:

Mam ową tabele:

+--------+---------+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------+---------+
| tab_id | user_id | sum_value | value1 | value2 | value3 | value4 | value5 | value6 | value7 | value8 | value9 | value10 |
+--------+---------+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------+---------+
|      5 |      12 |   73.3001 |  5.000 |  9.000 |  9.200 |  5.000 | 10.001 |  9.100 |  8.000 |  6.000 |  7.000 |   5.000 |
|      6 |      10 |   80.8002 | 10.001 |  9.000 |  8.000 |  7.000 |  4.000 |  5.000 | 10.000 | 10.801 |  8.000 |   9.000 |
|      7 |      16 |   80.8001 | 10.001 |  9.000 |  8.000 |  7.000 |  4.000 |  5.000 | 10.000 | 10.800 |  8.000 |   9.000 |
|      8 |      15 |   68.2000 |  6.000 |  6.000 |  7.000 |  5.000 |  4.000 |  9.000 |  8.000 |  6.000 | 10.000 |   7.200 |
|      9 |      17 |   87.5000 | 10.000 |  9.000 |  8.000 |  6.400 | 10.100 |  7.000 | 10.000 | 10.800 |  8.000 |   8.200 |
|     10 |      14 |   73.3001 |  5.000 |  9.000 |  9.200 | 10.000 | 10.001 |  9.100 |  7.000 |  4.000 |  5.000 |   5.000 |
|     11 |       9 |   73.3001 |  4.000 |  9.000 | 10.000 |  5.000 | 10.001 |  9.100 |  8.000 |  6.000 |  7.000 |   5.000 |
|     12 |       9 |   67.1001 |  3.000 |  7.000 | 10.000 |  5.000 | 10.001 |  6.000 |  8.000 |  6.000 |  7.000 |   5.000 |
+--------+---------+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------+---------+

i teraz chciałbym ponumerować wiersze.. więc mogę skorzystać z następującego kodu:

SET @row :=0;
SELECT *, @row:=row+1 as nr FROM tab_nr_7
ORDER BY sum_value DESC;

ale teraz próbując wyciagnąć wynik np. dla user_id = 15 chciałbym uzyskać nr = 4 , a moje dotychczasowe próby kończą się na tym, że dostaje nr =1 :(

Próbowałem m.in. takiego kodu:
(posiłkowałem się kodem znalezionych w sieci..)

SET @row :=0;
SELECT nr, user_id FROM (SELECT @row:=@row+1 as nr, user_id FROM tab_nr_7 WHERE user_id = 15 ORDER BY sum_value DESC) as sub WHERE user_id = 15
0

Wiersze się numeruje na kliencie. Zwłaszcza, gdy ma się korzystać z bazy MySQL - inne już mają wbudowane mechanizmy.

0

hm.. z tym, że jakby to miało wyglądać np. od strony php..

tzn.: mając tą tabele nie chce wyświetlać jej całej, ale tylko ten wynik (jeden wiersz), wynik dla danego użytkownika (user_id). To musialbym "załadować" wszystkie wyniki z tabeli do jakiego "kontenera" (array), tam to ponumerować i przekazać do "widoku", czyli np. jakiejś tabeli

ps. szczerze, to wolałbym to zrobić na poziomie mysql, ale pewnie jak tego odradzasz to masz ku temu podstawy :P (a może to jest niemożliwie? ;> w co wątpie..)

0

Oczywiście, że jest to możliwe. Nawet na MySQL-u.

set @lp:=0;
select @lp:=@lp+1 lp, id, liczba from 
(
SELECT 1 id, crc32(RAND()) liczba
union
SELECT 2, crc32(RAND())
UNION 
SELECT 3, crc32(RAND())
) x
ORDER BY x.liczba

tylko, że trzeba do tego celu wykorzystywać zmienne - w żadnym innym dialekcie nie trzeba.

0

@Marcin.Miga - z tym, że ja wyżej zamieściłem podobny kod do Twojego i mi on również dobrze numerował.. (patrz post 1).

Natomiast problem pojawia się wtedy, gdzy próbuje po klauzuli WHERE wyciągnąć konkretny wiersz.. wtedy mam jeden wynik z tabeli i jego numeracja zaczyna się niejako od początku.. a chciałbym uzykać numer wiersza względem całej tabeli... przykład z pierwszego posta: dla user_id = 15 chciałbym uzyskać nr = 4 (który jest względem całej tabeli) , a moje dotychczasowe próby kończą się na tym, że otrzymuje** nr =1** ..

1

No tak. Bo chcesz wyciągnąć nie numer wiersza, a jego ranking. A to się robi inaczej...
Ale...

SET @lp:=0;
SELECT @lp:=@lp+1 lp, id, liczba FROM 
(
SELECT 1 id, 11 liczba
UNION
SELECT 2, 12
UNION 
SELECT 3, 13
) x
ORDER BY x.liczba

to poprzednie zapytanie.
Rankingowe będzie prawie takie:

SET @lp:=0;
select * from (
SELECT @lp:=@lp+1 lp, id, liczba FROM 
(
SELECT 1 id, 11 liczba
UNION
SELECT 2, 12
UNION 
SELECT 3, 13
) x
ORDER BY x.liczba)x where liczba=12

1 użytkowników online, w tym zalogowanych: 0, gości: 1