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

SQL - Jak pobrać za pomocą ID.


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

#1 Kukol

    Zaawansowany

  • Zbanowany

Reputacja: 6
Nowy

  • Postów:113
  • Lokalizacja:Katowice
Offline

Napisano 08.09.2011 23:58

Witam, napisałęm sobie prosty plugin który wpisuje graczy do bazy danych którzy wejdę, tabela wygląda tak:

ID (AUTO_INCREMENT)
 
Nick
Nr

Teraz pytania:
1. Jak za pomocą ID pobrać nick?
2. Jak za pomocą Nr pobrać Nick wiedząc, że cztery osoby mogą mieć identyczny Nr?
3. Jak pobrać ilość Nr'ów.



Pozdrawiam.

#2 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 09.09.2011 00:31

1. do SELECT dodaj warunek WHERE
SELECT Nick FROM `tabela` WHERE id = JAKIES_ID

2. to samo tylko z Nr = JakisNumer, zapytanie zwróci wszystkich graczy o danym numerze i sobie któregoś wybierzesz

3.
SELECT COUNT(DISTINCT Nr) FROM `tabela`

Użytkownik R3X edytował ten post 09.09.2011 00:31

  • +
  • -
  • 1

#3 Kukol

    Zaawansowany

  • Autor tematu
  • Zbanowany

Reputacja: 6
Nowy

  • Postów:113
  • Lokalizacja:Katowice
Offline

Napisano 10.09.2011 10:38

No dobra. A teraz zrobiłem dwie bazy:

ID, Nick, Nr.

Oraz:

PID, ID, Nazwa

I teraz do pierwszej jest wpisywane ID (Auto_Increment) i ID jest wpisywany i przypisywane do PID w tej drugiej bazie tak, że ID w pierwszej i drugiej są identyczne. I jak np sprawdzić ile osób jest wpisanych do drugiej bazy? Oraz jak ID, PID, NR zapisać do zmiennej aby cały czas jej nie pobierać?

#4 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 10.09.2011 14:00

ilość unikatowych danych w tabeli obliczyć można
COUNT(DISTINCT kolumna)

Czyli to samo co z numerami
SELECT COUNT(DISTINCT ID) FROM `tabela`


Mam trochę za mało informacji by powiedzieć jak dobrze pobrać ID, PID, NR. ID na pewno możesz pobrać przy client_putinserver(), PID wygląda mi to na jakieś klasy graczy, więc przy zmianie/ustawianiu, a o NR to nie wiem zupełnie nic :P

Założyłeś klucz na ID w tej drugiej bazie? Jak nie to powinieneś :) a i to o czym tu mówimy to tabele ( CREATE TABLE ). Baza to zbiór tabel.
  • +
  • -
  • 1

#5 Kukol

    Zaawansowany

  • Autor tematu
  • Zbanowany

Reputacja: 6
Nowy

  • Postów:113
  • Lokalizacja:Katowice
Offline

Napisano 10.09.2011 16:32

W pierwszej bazie o nazwie "dom" chciałbym przechowywać dane:

- DID (Dom ID, auto inkrement)
- Nazwa (Nazwa)
- Ilosc (Ilosc graczy)

W drugiej bazie o nazwie "users" chciałbym przechowywać dane:

- ID (ID gracza, auto inktrement)
- DID (Nr. ID z bazy "dom" do której należy)
- Nick (Nick gracza)
- access (Dodatkowe pole)

Jak je połączyć, żeby gracze brali dane z "dom" do jakiego należą.

#6 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 10.09.2011 18:44

CREATE TABLE IF NOT EXISTS `dom`
(
    DID    INT UNSIGNED AUTO_INCREMENT,
    Nazwa    VARCHAR(64) NOT NULL,
    Ilosc    INT UNSIGNED NOT NULL default 0,

    PRIMARY KEY( DID )
)

CREATE TABLE IF NOT EXISTS `users`
(
    ID    INT UNSIGNED AUTO_INCREMENT,
    DID    INT UNSIGNED NULL,
    Nick    VARCHAR(32) NOT NULL,
    access    INT NULL,

    PRIMARY KEY( ID ),
    FOREIGN KEY( DID ) REFERENCES dom( DID )
)

Pobieranie danych o domu gracza polega na złączeniu tabel LEFT JOINem
SELECT `dom`.*, `users`.*
FROM `dom`
LEFT JOIN `users`
ON `dom`.DID = `users`.DID

  • +
  • -
  • 1

#7 Kukol

    Zaawansowany

  • Autor tematu
  • Zbanowany

Reputacja: 6
Nowy

  • Postów:113
  • Lokalizacja:Katowice
Offline

Napisano 10.09.2011 21:01

Okej. A teraz ostatnie pytanie. Jak pobrać mam je do zmiennej?

ID ma być zmienna z tablicą 33 znakową.
Nick ma mieć tablicę 33 znakową oraz drugą tablicę która będzie przechowywać DID?
DID ma mieć tablicę z maksymalną ilość "domów" ?
Access tak samo jak ID?
Oraz ilosc jak DID?

#8 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 10.09.2011 21:07

SQL_ReadResult(query)

Czytałeś http://amxx.pl/topic...czym-to-sie-je/ ?
  • +
  • -
  • 1

#9 Kukol

    Zaawansowany

  • Autor tematu
  • Zbanowany

Reputacja: 6
Nowy

  • Postów:113
  • Lokalizacja:Katowice
Offline

Napisano 11.09.2011 11:23

Okej.. Jakoś zrobiłem, wszystko zapisuje i odczytuje. Czy dobrze, pewnie nie, pewnie masa błędów, ale ważne, że odczytuje i zapisuje poprawnie, dziękuję bardzo.

Dziękuję.

A więc:

Jak pobrać z bazy i zapisać w zmiennej wszystkich graczy, którzy mają DID = X i zapisać ich nick do zmiennej? Maksymalna ilość graczy o takim samym DID to 4.

Użytkownik Kukol edytował ten post 11.09.2011 12:07


#10 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 11.09.2011 13:57

Np tak:
new gszNicki[4][32];
new giLoads;

selectByDID(DID)
{
    static szQuery[128];
    formatex(szQuery, 127, "SELECT Nick FROM users WHERE DID=%d", DID);
    
    giLoads = 0;
    SQL_ThreadQuery(gTuple, "handleSelectByDID", szQuery);
}

public handleSelectByDID(failstate, Handle:query, error[], errnum, data[], size)<mysql>{
    if(failstate != TQUERY_SUCCESS){
        log_amx("MySQL Select error: %s",error);
        return;
    }
    
    while(SQL_MoreResults(query))
    {
        if(giLoads >= sizeof(gszNicki))
            break;
            
        SQL_ReadResult(query, 0, gszNicki[giLoads++], charsmax(gszNicki[]));
        
        SQL_NextRow(query);
    }
    
    
    if(giLoads)
    {
        for(new i=0;i<giLoads;i++)
        {
            client_print(0, print_chat, "Znaleziony gracz: %s", gszNicki[i]);
        }
    }
    else
    {
        client_print(0, print_chat, "Nie znaleziono zadnego gracza");
    }
    
}

  • +
  • -
  • 1

#11 Kukol

    Zaawansowany

  • Autor tematu
  • Zbanowany

Reputacja: 6
Nowy

  • Postów:113
  • Lokalizacja:Katowice
Offline

Napisano 11.09.2011 22:09

Coś chyba nie tak, bo nie wyświetla mi komunikatu, ani jak próbowałem to w menu też nie wyświetliło..

#12 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 11.09.2011 22:35

wywołałeś gdzieś
selectByDID(DID)

i masz uchwyt do bazy nazwany gTuple?

Jeśli na oba pytania odpowiedziałeś tak to sprawdź jeszcze logi
  • +
  • -
  • 1

#13 Kukol

    Zaawansowany

  • Autor tematu
  • Zbanowany

Reputacja: 6
Nowy

  • Postów:113
  • Lokalizacja:Katowice
Offline

Napisano 11.09.2011 22:59

Moja wina, zwracam honor.

Czy mógłbyś mi jeszcze na "chłopski rozum" powiedzieć co dokładnie robi to zapytanie? Bo nie wiem, czy jak nie ma wpisu to ma tworzyć rekord z domem czy userem...

SELECT `dom`.*, `users`.*
FROM `dom`
LEFT JOIN `users`
ON `dom`.DID = `users`.DID

I jutro jeszcze raz wszystko muszę od nowa napisać, bo już mniej więcej wiem jak to ogarnąć. Bo teraz jakimś cudem powiela wpisy i nie pobiera ID, coś namieszałem, jutro na spokojnie wszystko przepiszę..

Dziękuję bardzo za Twą pomoc.

Użytkownik Kukol edytował ten post 11.09.2011 23:01


#14 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 11.09.2011 23:31

Co do tego selecta to byś musiał poczytał o relacjach i złączeniach. Tak ma zachętę mogę powiedzieć, że przetwarza wszystkie kolumny z głównej (`dom`) i dołączanej tabeli (`users`), ale zwraca tylko te dla których warunek (`dom`.DID = `users`.DID) jest prawdziwy. Wynikiem tego są wszystkie istniejące w bazie pary ID-DID, czyli wszyscy gracze i domy do których należą.
  • +
  • -
  • 1

#15 Kukol

    Zaawansowany

  • Autor tematu
  • Zbanowany

Reputacja: 6
Nowy

  • Postów:113
  • Lokalizacja:Katowice
Offline

Napisano 11.09.2011 23:35

Czyli jak gracz w users ma DID = 2 i w domach DID = 2 to zwróci wyniki z users i dom, dobrze zrozumiałem? Czyli w tym mogę pobrać na raz wszystkie dane i zapisać je w zmiennych?

#16 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 12.09.2011 00:13

Tak dobrze

Możesz też całą bazę pozapisywać w zmiennych, ale nie o to przecież chodzi :) Rozsądne by było zapisanie w tablicy wszystkich domów do których należy gracz wchodzący na serwer, w putinserver dać zapytanie z warunkiem Nick=NickGracza albo jakto tam zapisujesz.
  • +
  • -
  • 1

#17 Kukol

    Zaawansowany

  • Autor tematu
  • Zbanowany

Reputacja: 6
Nowy

  • Postów:113
  • Lokalizacja:Katowice
Offline

Napisano 12.09.2011 14:14

Jest pewien problem. Gdy ID i DID pobieram przed wywołaniem:


SELECT `dom`.*, `users`.*
FROM `dom`
LEFT JOIN `users`
ON `dom`.DID = `users`.DID


To jest ok, a gdy Access pobiorę z zapytaniem w/w to po reconnekcie Access maleje, czemu?

Użytkownik Kukol edytował ten post 12.09.2011 16:40


#18 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 12.09.2011 21:18

szczerze to nie wiem o jaki Access chodzi
  • +
  • -
  • 0

#19 Kukol

    Zaawansowany

  • Autor tematu
  • Zbanowany

Reputacja: 6
Nowy

  • Postów:113
  • Lokalizacja:Katowice
Offline

Napisano 12.09.2011 21:48

W bazie mam pole "Access" i jak pobieram je po wywołaniu

SELECT `dom`.*, `users`.*
FROM `dom`
LEFT JOIN `users`
ON `dom`.DID = `users`.DID

To po reconnekcie zmienia się wartość na 0. Czyli mam rozumieć, że po tym zapytaniu mam pobierać same z dane z tabeli "Dom"?

//Edit:

Może nie tak, mam do pobrania ID, DID, Access [Z tabeli users] NazwaDomu, Ilosc [ Z tabeli dom] gdzie je pobrać i kiedy.

Użytkownik Kukol edytował ten post 12.09.2011 22:11


#20 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 12.09.2011 22:29

a już przy select
SELECT  `users`.ID, `users`.DID, `users`.Access, `dom`.NazwaDomu, `dom`.Ilosc
FROM `dom`
LEFT JOIN `users`
ON `dom`.DID = `users`.DID

  • +
  • -
  • 1




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

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