Skocz do zawartości

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

Zapytania sql


Najlepsza odpowiedź _McHappy, 10.04.2018 20:40

Tak więc chodzi o rozwiązanie z pkt. 1 -> post #4. Dla wspomnianego przez Ciebie przypadku:

`wartosc_1`     `wartosc_2`     `wartosc_3`

   3684            628             253
   5809            246             738
   2649            226             97
   1180            973             495

Podanie wartości kolumn:

`wartosc_1` = 5809
`wartosc_2` = 246

zwróci wynik: 3 (3 pozycja od największej).

 

Co ciekawsze, skoro `wartosc_1` jest unikalna i ją znasz, to nie potrzebujesz `wartosc_2` do znalezienia wiersza i jego pozycji, wystarczy unikalna `wartosc_1` ;)

 

W tym wypadku kwerenda będzie wyglądała następująco (analogicznie jak w poście #4):

SELECT `pozycja`
    FROM (SELECT `wartosc_1`, (@nr_wiersza:=@nr_wiersza+1) AS `pozycja`
        FROM `nazwa_tabeli`, (SELECT @nr_wiersza:=0) `tmp` ORDER BY `wartosc_2` DESC) `tmp`
    WHERE wartosc_1=5809;

Jej uchwyt:

new iPozycjaWierszaWynikowego;
if(SQL_NumResults(hUchwytKwerendy))
{
     iPozycjaWierszaWynikowego = SQL_ReadResult(hUchwytKwerendy, SQL_FieldNameToNum(hUchwytKwerendy, "pozycja"));
}
else
{
     log_amx("Nie znaleziono rekordu spelniajacego podane kryteria");
}

W zmiennej iPozycjaWierszaWynikowego przechowywana jest pozycja wiersza (po przesortowaniu wg kolumny `wartosc_2`, którego podana `wartosc_1` wynosiła 5809).

Czyli w uproszczeniu, iPozycjaWierszaWynikowego = 3.

Przejdź do postu


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
9 odpowiedzi w tym temacie

#1 csMaster

    Wszechwiedzący

  • Power User

Reputacja: 14
Początkujący

  • Postów:542
  • Lokalizacja:localhost
Offline

Napisano 09.04.2018 19:54

W jaki sposób zapisać w tablicy np. 3 wyniki z zapytań sql, który spośród wszystkich były największe ?

Powiedzmy że mam w bazie sql jakieś 1000 wierszy ("wartosc_1", "wartosc_2", "wartosc_3" - kolumny) i chce żeby w stworzonej w pluginie tablicy (new tablica[3]) zapisały się np. 3 wyniki z bazy, których wartość kolumny "wartosc_2" będzie największa. Jeśli dość dokładnie wytłumaczyłem to, o co mi chodzi, to w jaki sposób to zrobić ?

 

Oczywiście nie będę robił tak że wyśle jakieś 1000 zapytań bo mi się serwer pewnie zetnie >.<


  • +
  • -
  • 0

#2 _McHappy

    Wszechwiedzący

  • Support Team

Reputacja: 243
Wszechwidzący

  • Postów:501
  • GG:
  • Imię:Radek
  • Lokalizacja:Tak
Offline

Napisano 09.04.2018 22:21

Treść kwerendy:

SELECT * FROM `nazwa_tabeli` ORDER BY `wartosc_2` DESC LIMIT ŻĄDANA_ILOŚĆ_WIERSZY_WYNIKOWYCH;

 Więcej na temat klauzuli:

- 'ORDER BY': https://www.w3school...sql_orderby.asp

- 'LIMIT': https://www.w3school...sql/sql_top.asp

 

 

W uchwycie zapytania użyj podobnej konstrukcji:

new iNrWierszaWynikowego;
while(SQL_MoreResults(hUchwytKwerendy))
{
     tablica[iNrWierszaWynikowego++] = SQL_ReadResult(hUchwytKwerendy, NR_KOLUMNY);
}

Element 0. tablicy 'tablica' będzie zawierał dane z rekordu SQL, którego wartość kolumny `wartosc_2` jest największa ze wszystkich.

Element 1. --||-- jest druga co do wielkości.

Element 2. --||-- jest trzecia co do wielkości itp.


Użytkownik _McHappy edytował ten post 09.04.2018 22:31

  • +
  • -
  • 1

#3 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:542
  • Lokalizacja:localhost
Offline

Napisano 10.04.2018 14:26

Dzięki, ale mam jeszcze jedno pytanie.

 

Jakbym miał `wartosc_1` i chciałbym sprawdzić pod względem wielkości `wartosc_2` który z kolejności byłby ten wynik ?

np. `wartość_1` jest 764 a `wartosc_2` = 347, a w innym wierszu `wartosc_1` jest 423 a `wartosc_2` = 179

I jak w ten sposób mając `wartosc_1` i `wartosc_2` sprawdzić który w kolejności (od największych) jest ten wiersz pod względem `wartosc_2` ?


  • +
  • -
  • 0

#4 _McHappy

    Wszechwiedzący

  • Support Team

Reputacja: 243
Wszechwidzący

  • Postów:501
  • GG:
  • Imię:Radek
  • Lokalizacja:Tak
Offline

Napisano 10.04.2018 16:19

Nie jestem pewien do czego dążysz, ale jednym z możliwych rozwiązań jest wykonanie tej kwerendy:

SELECT `pozycja`
    FROM (SELECT `wartosc_1`, `wartosc_2`, (@nr_wiersza:=@nr_wiersza+1) AS `pozycja`
        FROM `nazwa_tabeli`, (SELECT @nr_wiersza:=0) tmp ORDER BY `wartosc_2` DESC) `tmp`
    WHERE wartosc_1=ŻĄDANA_WARTOŚĆ_1 AND wartosc_2=ŻĄDANA_WARTOŚĆ_2;

Jej uchwyt w amxx'ie wyglądałby następująco:

new iPozycjaWierszaWynikowego;
if(SQL_NumResults(hUchwytKwerendy))
{
     iPozycjaWierszaWynikowego = SQL_ReadResult(hUchwytKwerendy, SQL_FieldNameToNum(hUchwytKwerendy, "pozycja"));
}
else
{
     log_amx("Nie znaleziono rekordu z podanymi wartosciami kolumn");
}

Użytkownik _McHappy edytował ten post 10.04.2018 16:20

  • +
  • -
  • 0

#5 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:542
  • Lokalizacja:localhost
Offline

Napisano 10.04.2018 16:47

Spróbuje dokładniej wyjaśnić.

 

Gdybym w bazie miał tylko 4 takie wiersze:

`wartosc_1`     `wartosc_2`     `wartosc_3`

   3684            628             253
   5809            246             738
   2649            226             97
   1180            973             495

i znałbym wartości jednego z tych wierszy.

 

Jak sformatować zapytanie i handler w pluginie, żebym np. znając wartości tego drugiego wiersza mógł przypisać do tablicy który pod względem wielkości `wartosc_2` jest ten wiersz (Najwiekszy: 1, Drugi: 2, itd.) ?

W tym przypadku który podałem kolejność byłaby taka:

 

`wartosc_1`:

1.  1180

2.  3684

3.  5809

4.  2649

 

I tak samo wyglądałaby kolejność `wartosc_3`, ponieważ chodzi mi tylko o sortowanie wszystkich wierszy względem wielkości `wartosc_2`.

Wierszy byłoby jakieś 1000 to już by raczej po kolei wykonywanie zapytań nie pomogło. :/


  • +
  • -
  • 0

#6 _McHappy

    Wszechwiedzący

  • Support Team

Reputacja: 243
Wszechwidzący

  • Postów:501
  • GG:
  • Imię:Radek
  • Lokalizacja:Tak
Offline

Napisano 10.04.2018 17:06

Które z poniższych chcesz osiągnąć?

1. Potrzebujesz informacji o jednym wierszu - tzn: znasz wartości `wartosc_1` oraz `wartosc_2` i chcesz wiedzieć, który będzie na liście.

2. Potrzebujesz informacji o wszystkich wierszach - chcesz znać listę posortowanych wartości wraz z ich pozycjami.

 

Dla 1. rozwiązanie jest w poście #4, dla 2. rozwiązanie jest w poście #2.

Jeśli chcesz mieć listę i jednocześnie uzyskiwać pozycję danego elementu (zawartego w owej liście), to wystarczy odpowiednio sprawdzać zmienną

iNrWierszaWynikowego

z rozwiązania zawartego w poście #2.


  • +
  • -
  • 0

#7 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:542
  • Lokalizacja:localhost
Offline

Napisano 10.04.2018 17:45

Mam już `wartosc_1` i jest ona unikalna (nie może się powtórzyć).

Mam też `wartosc_2` z tego samego wiersza.

I chcę żeby w zmiennej zapisała się pozycja (od największej wartości) na której jest ten wiersz względem `wartosc_2`.

 

No po prostu chce z danego wiersza sprawdzić która co do wielkości od największej jest `wartosc_2` w tym wierszu. :P


  • +
  • -
  • 0

#8 _McHappy

    Wszechwiedzący

  • Support Team

Reputacja: 243
Wszechwidzący

  • Postów:501
  • GG:
  • Imię:Radek
  • Lokalizacja:Tak
Offline

Napisano 10.04.2018 20:40   Najlepsza odpowiedź

Tak więc chodzi o rozwiązanie z pkt. 1 -> post #4. Dla wspomnianego przez Ciebie przypadku:

`wartosc_1`     `wartosc_2`     `wartosc_3`

   3684            628             253
   5809            246             738
   2649            226             97
   1180            973             495

Podanie wartości kolumn:

`wartosc_1` = 5809
`wartosc_2` = 246

zwróci wynik: 3 (3 pozycja od największej).

 

Co ciekawsze, skoro `wartosc_1` jest unikalna i ją znasz, to nie potrzebujesz `wartosc_2` do znalezienia wiersza i jego pozycji, wystarczy unikalna `wartosc_1` ;)

 

W tym wypadku kwerenda będzie wyglądała następująco (analogicznie jak w poście #4):

SELECT `pozycja`
    FROM (SELECT `wartosc_1`, (@nr_wiersza:=@nr_wiersza+1) AS `pozycja`
        FROM `nazwa_tabeli`, (SELECT @nr_wiersza:=0) `tmp` ORDER BY `wartosc_2` DESC) `tmp`
    WHERE wartosc_1=5809;

Jej uchwyt:

new iPozycjaWierszaWynikowego;
if(SQL_NumResults(hUchwytKwerendy))
{
     iPozycjaWierszaWynikowego = SQL_ReadResult(hUchwytKwerendy, SQL_FieldNameToNum(hUchwytKwerendy, "pozycja"));
}
else
{
     log_amx("Nie znaleziono rekordu spelniajacego podane kryteria");
}

W zmiennej iPozycjaWierszaWynikowego przechowywana jest pozycja wiersza (po przesortowaniu wg kolumny `wartosc_2`, którego podana `wartosc_1` wynosiła 5809).

Czyli w uproszczeniu, iPozycjaWierszaWynikowego = 3.


Użytkownik _McHappy edytował ten post 10.04.2018 20:49

  • +
  • -
  • 1

#9 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:542
  • Lokalizacja:localhost
Offline

Napisano 11.04.2018 13:30

Jak dla mnie powinno działać, tylko co ma oznaczać ta `pozycja` i @nr_wiersza ? Nie mam w bazie kolumny "pozycja" więc jeśli o to chodzi to raczej musze ją dodać.


  • +
  • -
  • 0

#10 _McHappy

    Wszechwiedzący

  • Support Team

Reputacja: 243
Wszechwidzący

  • Postów:501
  • GG:
  • Imię:Radek
  • Lokalizacja:Tak
Offline

Napisano 11.04.2018 15:14

Kolumna `pozycja` jest dodawana tymczasowo na potrzeby kwerendy, nie trzeba jej dodawać do tabeli w bazie.

@nr_wiersza jest tymczasową zmienną użytą do indeksowania posortowanych wyników.

Powyższe kwerendy są dostosowane do przykładowych danych, które podałeś wyżej.


  • +
  • -
  • 0




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

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