Skocz do zawartości

  • Zaloguj korzystając z Facebooka Zaloguj korzystając z Twittera Zaloguj przez Steam Zaloguj poprzez Google      Logowanie »   
  • Rejestracja

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.

  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Pozycja gracza w top10


Najlepsza odpowiedź Permanent, 15.07.2013 16:06

Dziękuje ci za pomoc, wszystko działa.

Rozdzieliłem to na dwa zapytania i śmiga - wczytuje 1.5, 2 sec, ale to i tak dobrze.

 

Temat uważam za rozwiązany.

Przejdź do postu


  • Zamknięty Temat jest zamknięty
12 odpowiedzi w tym temacie

#1 Permanent

    Początkujący

  • Użytkownik

Reputacja: 0
zer0.

  • Postów:11
  • Lokalizacja:D.Górnicza
Offline

Napisano 11.07.2013 14:11

Witam. Jeżeli to zły dział, to prosiłbym o przeniesienie tematu.

 

Chciałem zrobic zapytanie do MYSQL, który miał na celu pokazanie graczowi jego aktualnej pozycji w top10 expa, lecz coś nie działa.

 

O to kod.

SELECT nick, exp, (SELECT COUNT(*) FROM nazwa_tablicy WHERE exp > (SELECT exp FROM nazwa_tablicy WHERE nick = $nick_Gracza)) AS WTFMAN FROM nazwa_tablicy ORDER BY exp LIMIT 10;

Czy ktoś wie gdzie leży błąd?

 

WTFMAN - to pozycja gracza.


Użytkownik Permanent edytował ten post 11.07.2013 14:13

  • +
  • -
  • 0

#2 Permanent

    Początkujący

  • Autor tematu
  • Użytkownik

Reputacja: 0
zer0.

  • Postów:11
  • Lokalizacja:D.Górnicza
Offline

Napisano 11.07.2013 19:29

Ref.

 

Czy jest ktoś w stanie pomóc? Jest to dla mnie ważne.


  • +
  • -
  • 0

#3 GwynBleidD

    Godlike

  • Administrator

Reputacja: 1849
Godlike

  • Postów:3066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 11.07.2013 23:39

3 zapytania jedno w drugim to nie jest dobra praktyka. Poza tym "exp" to słowo kluczowe, więc powinno być zapisane pomiędzy ` `.

 

Da się to jedym, używając joina. Wydajniej :)

SELECT l.nick, l.`exp`, COUNT('1')+1 AS `rank` FROM nazwa_tabeli AS l LEFT JOIN nazwa_tabeli AS r ON l.id=r.id WHERE l.`exp`>r.`exp` GROUP BY l.nick

 

Spróbuj :)


  • +
  • -
  • 0
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark

#4 Permanent

    Początkujący

  • Autor tematu
  • Użytkownik

Reputacja: 0
zer0.

  • Postów:11
  • Lokalizacja:D.Górnicza
Offline

Napisano 11.07.2013 23:51

A czasem nie uzywa sie JOIN i I.id = r.id jednocześnie, bo robi to już JOIN? Trochę się w tym orientuje i nie wiem czy tak na pewno powinno być.


  • +
  • -
  • 0

#5 GwynBleidD

    Godlike

  • Administrator

Reputacja: 1849
Godlike

  • Postów:3066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 11.07.2013 23:55

Joinować możesz po dowolnym polu, dlatego nie masz racji, musisz określić dokładnie warunek dla Joina.


  • +
  • -
  • 0
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark

#6 Permanent

    Początkujący

  • Autor tematu
  • Użytkownik

Reputacja: 0
zer0.

  • Postów:11
  • Lokalizacja:D.Górnicza
Offline

Napisano 12.07.2013 00:06

Nie wiem dlaczego, ale coś nie działa, nic się nie dzieje w ogóle.

 

Mam takie coś jeszcze

SELECT nick, exp, (SELECT COUNT(*) FROM nazwa_tablicy WHERE exp > (SELECT exp FROM nazwa_tablicy WHERE nick = $nick_Gracza)) AS WTFMAN FROM nazwa_tablicy ORDER BY exp DESC LIMIT 10;

Wszystko działa, tylko pokazuje aktualne miejsce każdego gracza na 9.

 

Tu chodzi o to, że chciałbym aby to wyglądało tak:

 

Mamy całą tabelę top10 exp i jest w nim Top 10 exp, jeżeli jakiegoś gracza nie będzie na liście top 10 expa, to aby pokazywało jego aktualne miejsce i to zapytanie, które podałem, działa, ale pokazuje wszystkich na 9.

Count zle pokazuje bo pokazuje wszystkich miejsce na 9


Użytkownik Permanent edytował ten post 12.07.2013 00:24

  • +
  • -
  • 0

#7 GwynBleidD

    Godlike

  • Administrator

Reputacja: 1849
Godlike

  • Postów:3066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 12.07.2013 11:17

Pokaż mi strukturę swojej tabeli w bazie danych (kolumny, indeksy), bo mogę tylko zgadywać co Ty tam masz i czego nie masz.

 

2ga sprawa: używasz tego zapytania w PHP, czy w pluginie na serwerze? Jeśli w pluginie na serwerze, podaj mi DOKŁADNĄ treść zapytania skopiowaną bezpośrednio z pluginu, bo nie wiem w którym miejscu określasz jakiego gracza dane powinny być pobrane z serwera.

 

//edit

 

Tamto zapytanie pisałem po pijaku i trochę zmęczony, w 2ch miejscach się pomyliłem. Tu masz na 100% działające. Jeśli chcesz wyświetlić ranking konkretnego gracza, dodaj WHERE l.nick='nick gracza' przed GROUP BY Możesz wtedy pominąć ORDER BY. Jeśli chcesz wyświetlić określoną ilość miejsc w rankingu (zaczynając od dowolnego) dopisz na końcu LIMIT ilość OFFSET zaczynając_od. OFFSET możesz oczywiście pominąć.

 

SELECT
    l.nick AS `nick`,
    l.`exp` AS `exp`,
    COUNT('1')+1 AS `rank`
FROM nazwa_tabeli AS l
    LEFT JOIN nazwa_tabeli AS r
    ON l.`exp`<r.`exp`
GROUP BY l.nick
ORDER BY exp DESC

 

Zapytanie w polu rank wpisze ranking każdego gracza, dodatkowo gdy 2 osoby będą miały tą samą ilość rankingu, będą obie na miejscu np 5tym, a osoba tuż za nimi będzie na 7mym (tak, jak w normalnym systemie rankingowym powinno być).

 

Możesz to sobie w jednej linii też dać spokojnie :)


Użytkownik GwynBleidD edytował ten post 12.07.2013 19:26

  • +
  • -
  • 0
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark

#8 Permanent

    Początkujący

  • Autor tematu
  • Użytkownik

Reputacja: 0
zer0.

  • Postów:11
  • Lokalizacja:D.Górnicza
Offline

Napisano 12.07.2013 21:07

Nie działa, cały edytor się zawiesza.

 

Napiszę dokładnie:

 

To ma być zapytanie dla rankingu top10 z twoją aktualną pozycją jeśli nie ma cię w top10, pobierasz nick i exp i sortujesz wg expa.

 

I to może być obojętnie pod co, bo i tak jeden ciul gdzie chce to wyświetlić.

 

Użyłem jeszcze tego:

SELECT nick, exp, (SELECT COUNT(*) FROM nazwa_tablicy ND WHERE ND.exp > (SELECT exp FROM nazwa_tablicy MHM WHERE MHM.nick = $nick_Gracza)) AS WTFMAN FROM nazwa_tablicy OLS ORDER BY OLS.exp DESC LIMIT 10;

Ale zaś tutaj pokazuje wszystkich na 0, już nie wiem jak temu zaradzić.


Użytkownik Permanent edytował ten post 12.07.2013 21:12

  • +
  • -
  • 0

#9 Permanent

    Początkujący

  • Autor tematu
  • Użytkownik

Reputacja: 0
zer0.

  • Postów:11
  • Lokalizacja:D.Górnicza
Offline

Napisano 12.07.2013 21:51

Proszę nie uznawać tego za spam, ale nie mam już opcji Edytuj.

 

Głównie chodzi mi o ulożenie optymalnego zapytania na ranking TOP10 + Twoja aktualna pozycja na podstawie nick = 'nick_gracza' coś jak SELECT TOP10 AND Pozycja gracza where nick = 'Jakis_nick'


  • +
  • -
  • 0

#10 GwynBleidD

    Godlike

  • Administrator

Reputacja: 1849
Godlike

  • Postów:3066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 13.07.2013 02:24

Dobra, jeszcze jedno podejście :P

 

SELECT
    l.nick AS `nick`,
    l.`exp` AS `exp`,
    COUNT(r.`exp`)+1 AS `rank`
FROM nazwa_tabeli AS l
    LEFT JOIN nazwa_tabeli AS r
    ON l.`exp`<r.`exp`
GROUP BY l.nick
ORDER BY `exp` DESC

 

Jeśli masz w tabeli co najmniej kolumny nick i exp, to to zapytanie MUSI zadziałać. Testowałem na szybko utworzonej tabeli i wszystko było ok. W stosunku do poprzedniego zapytania naprawiłem wyświetlanie 1 pozycji (wyświetlało jako 2, bo jeden mały błąd był) oraz ująłem w odwrócone apostrofy ostatnie wystąpienie słowa exp.

 

SELECT
    l.nick AS `nick`,
    l.`exp` AS `exp`,
    COUNT(r.`exp`)+1 AS `rank`
FROM nazwa_tabeli AS l
    LEFT JOIN nazwa_tabeli AS r
    ON l.`exp`<r.`exp`
GROUP BY l.nick
HAVING rank<=10 OR nick='NICK GRACZA'
ORDER BY `exp` DESC

Tutaj masz wersję, która po wstawieniu nicku w odpowiednie pole wyświetli CI top10 (jeśli na 10 pozycji jest remis, to poda wszystkie 10 pozycje) ORAZ jeśli w top10 nie ma zadanego gracza, zostanie również podany wraz z jego miejscem, gdy np miał 50 miejsce, zostanie wyświetlony. Wystarczywyciąć OR nick.... aż do końca linii i wyświetla jedynie top10 :)

 

I powtarzam jeszcze raz, to MUSI działać!!!


  • +
  • -
  • 1
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark

#11 Permanent

    Początkujący

  • Autor tematu
  • Użytkownik

Reputacja: 0
zer0.

  • Postów:11
  • Lokalizacja:D.Górnicza
Offline

Napisano 13.07.2013 02:47

Powiem ci, że dochodzimy do mety od samej linii startu :D

 

Powiem tak, że wszystko działa jeśli zostawiłem 100 kont, a przy 45000 się wiesza jak cholera. Wiesz czym to może być spowodowane?


  • +
  • -
  • 0

#12 GwynBleidD

    Godlike

  • Administrator

Reputacja: 1849
Godlike

  • Postów:3066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 13.07.2013 12:17

Obliczanie rankingu dla 45 tys. rekordów trochę musi potrwać. W tym przypadku jednak lepiej rozbić to na 2 zapytania. W jednym pobierz top 10 w tradycyjny sposób, a drugim zapytaniem samą pozycję gracza, ale i tak to trochę potrwa... Pomoże utworzenie indeksu na polu expa


  • +
  • -
  • 1
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark

#13 Permanent

    Początkujący

  • Autor tematu
  • Użytkownik

Reputacja: 0
zer0.

  • Postów:11
  • Lokalizacja:D.Górnicza
Offline

Napisano 15.07.2013 16:06   Najlepsza odpowiedź

Dziękuje ci za pomoc, wszystko działa.

Rozdzieliłem to na dwa zapytania i śmiga - wczytuje 1.5, 2 sec, ale to i tak dobrze.

 

Temat uważam za rozwiązany.


  • +
  • -
  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych