Czy istnieje sposób, aby uzyskać rzeczywisty numer wiersza z zapytania?
Chcę mieć możliwość zamówienia tabeli o nazwie league_girl za pomocą pola o nazwie score; i zwróć nazwę użytkownika i rzeczywistą pozycję w wierszu tej nazwy użytkownika.
Chcę uszeregować użytkowników, aby móc określić, gdzie jest dany użytkownik, tj. Joe zajmuje pozycję 100 z 200, tj
User Score Row
Joe 100 1
Bob 50 2
Bill 10 3
Widziałem tutaj kilka rozwiązań, ale wypróbowałem większość z nich i żadne z nich nie zwraca numeru wiersza.
Próbowałem tego:
SELECT position, username, score
FROM (SELECT @row := @row + 1 AS position, username, score
FROM league_girl GROUP BY username ORDER BY score DESC)
Jak pochodne
... ale wygląda na to, że nie zwraca pozycji wiersza.
Jakieś pomysły?
Odpowiedzi:
Możesz spróbować następujących rzeczy:
JOIN (SELECT @curRow := 0)
Część pozwala zmiennej inicjalizacji bez potrzeby dodatkowegoSET
polecenia.Przypadek testowy:
Zapytanie testowe:
Wynik:
źródło
@curRow
, zastępującJOIN
instrukcję przecinkiem, na przykład:FROM league_girl l, (SELECT @curRow := 0) r
ORDER BY
?źródło
Oto struktura szablonu, którego użyłem:
A oto mój działający kod:
źródło
Możesz także użyć
aby zainicjować zmienną licznika.
źródło
@curRow
może nadal mieć wartość z ostatniego uruchomienia tego zapytania w bieżącej sesji.Zakładając, że MySQL to obsługuje, możesz to łatwo zrobić za pomocą standardowego podzapytania SQL:
W przypadku dużej liczby wyświetlanych wyników będzie to trochę powolne i zamiast tego będziesz chciał przełączyć się na łączenie własne.
źródło
Jeśli chcesz tylko poznać pozycję jednego konkretnego użytkownika po uporządkowaniu według wyniku pola, możesz po prostu wybrać wszystkie wiersze z tabeli, w których wynik pola jest wyższy niż bieżący wynik użytkownika. I użyj numeru wiersza zwróconego + 1, aby dowiedzieć się, która pozycja bieżącego użytkownika.
Zakładając, że Twoja tabela jest
league_girl
i Twoje podstawowe pole toid
, możesz użyć tego:źródło
Oryginalna odpowiedź okazała się niezwykle pomocna, ale chciałem też pobrać pewien zestaw wierszy na podstawie numerów wierszy, które wstawiałem. W związku z tym zawarłem całą pierwotną odpowiedź w podzapytaniu, aby móc odwołać się do numeru wiersza, który wstawiałem.
Posiadanie podzapytania w podzapytaniu nie jest zbyt wydajne, dlatego warto sprawdzić, czy uzyskasz lepszy wynik, zlecając serwerowi SQL obsługę tego zapytania, czy pobierając całą tabelę i zmuszając aplikację / serwer WWW do manipulowania wierszami po fakcie .
Osobiście mój serwer SQL nie jest zbyt zajęty, więc preferowane było posiadanie obsługi zagnieżdżonych podzapytań.
źródło
Wiem, że OP prosi o
mysql
odpowiedź, ale ponieważ okazało się, że inne odpowiedzi nie działają dla mnie,order by
Aby zaoszczędzić czas innym takim jak ja, po prostu zindeksuj wiersz po pobraniu ich z bazy danych
przykład w PHP:
przykład w PHP z użyciem offsetu i limitu stronicowania:
źródło