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

Wczytyanie danych z bazy "na raz"


Najlepsza odpowiedź _McHappy, 16.07.2017 10:19

Hmmm. W tej sytuacji kombinowałbym z operatorem UNION ALL lub UNION z dopełnieniem NULL-kolumnowym. Przejdź do postu


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

#1 d0naciak

    Godlike

  • Power User

Reputacja: 1 029
Hero

  • Postów:2 414
  • GG:
  • Steam:steam
  • Imię:Dawid
  • Lokalizacja:Kotlarka
Offline

Napisano 15.07.2017 19:02

Witam, mam taki problem a raczej zagwostkę. Otóż chciałbym wczytać dane z bazy danych z dwóch różnych tabel. Zakładając że baza jest na zewnątrz, używam funkcji threaded (nie wiem jak to po polsku nazwać, kumaci zrozumieją :P), i wszystkie dane wczytać na raz, aby nie łączyć się nie potrzebnie dwa razy z bazą, jest taka opcja? I jak te dane potem odpowiednio wyciągnąć do np. zmiennych?


  • +
  • -
  • 0

#2 _McHappy

    Wszechwiedzący

  • Support Team

Reputacja: 243
Wszechwidzący

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

Napisano 15.07.2017 20:43

Nie wiem, czy wątkowane kwerendy też to obsługują, ale najpewniej powinny - sformatuj sobie dwie kwerendy do jednego stringa, oddzielając je ';' jak na sql przystało. W handlerze użyj SQL_NextResultSet() [https://amxx.pl/dokumentacja/f1356/sql-nextresultset] do przejścia między zwróconymi tabelami (stosując multi-kwerendę z klauzlami SELECT, baza zwróci kilka tabel - wykonaj kod kwerendy w phpmyadmin i od razu zobaczysz o co chodzi).

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

  • +
  • -
  • 0

#3 _McHappy

    Wszechwiedzący

  • Support Team

Reputacja: 243
Wszechwidzący

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

Napisano 15.07.2017 22:59

@UP
Jednak jeżeli chodzi o kwerendy wątkowane <dokumentacja>:

bool AtomicResult::NextResultSet()
{
return false;
}

Zatem rozchodzi się o uzyskanie wyników tylko w jednej tabeli.
Optymalizacja jest w tym przypadku zależna od struktury tabel, z których chcesz pozyskiwać dane oraz ilości zwróconych rekordów...
  • +
  • -
  • 0

#4 d0naciak

    Godlike

  • Autor tematu
  • Power User

Reputacja: 1 029
Hero

  • Postów:2 414
  • GG:
  • Steam:steam
  • Imię:Dawid
  • Lokalizacja:Kotlarka
Offline

Napisano 16.07.2017 07:02

P.S. Chodzi tu o SourceModa, ale tam podobnie - nie działa na kwerendach wątkowych.

Chyba muszę 2 razy użyć SQL_TQuery, ponieważ mam jedną tabelę z graczami i dla nich danymi typu ranga, staty itd., druga tabela to misje która posiada listę misji, trzecia tabela to misje gracza połączona z tabelą misję i gracze - w niej sprawdzam którą misję gracz już wykonał

Myślałem ew. na wczytywaniu misji z pliku, ale chyba dużo mi to nie da, bo tak czy siak muszę wczytywać 2 razy dane z bazy.


  • +
  • -
  • 0

#5 _McHappy

    Wszechwiedzący

  • Support Team

Reputacja: 243
Wszechwidzący

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

Napisano 16.07.2017 10:19   Najlepsza odpowiedź

Hmmm. W tej sytuacji kombinowałbym z operatorem UNION ALL lub UNION z dopełnieniem NULL-kolumnowym.
  • +
  • -
  • 1

#6 tytusek

    Czempion

  • Power User

Reputacja: 229
Wszechwidzący

  • Postów:822
Offline

Napisano 16.07.2017 14:38

jak używasz kluczy obcych to możesz przez INNER JOIN połączyć i w jednym zapytaniu 2 tabele wczytac


  • +
  • -
  • 0

#7 Ogen Dogen

    Czempion

  • Power User

Reputacja: 261
Wszechwidzący

  • Postów:837
  • GG:
  • Steam:steam
  • Imię:Marcin
  • Lokalizacja:Dąbrowa Górnicza
Offline

Napisano 16.07.2017 14:40

Jak możesz to podaj strukturę tych tabel, ale wydaje mi się że zwykły JOIN wystarczy.


  • +
  • -
  • 1

b_350_20_360204_C20008_FFFFFF_000000.png 193.33.176.115:27015

 

94e23d811c.png

 


#8 _McHappy

    Wszechwiedzący

  • Support Team

Reputacja: 243
Wszechwidzący

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

Napisano 16.07.2017 14:51

Może rzeczywiście lepiej zacząć od pytania, co konkretnie ma zwrócić kwerenda (jaki jest cel jej wykonania) :D

Użytkownik _McHappy edytował ten post 16.07.2017 14:53

  • +
  • -
  • 0

#9 d0naciak

    Godlike

  • Autor tematu
  • Power User

Reputacja: 1 029
Hero

  • Postów:2 414
  • GG:
  • Steam:steam
  • Imię:Dawid
  • Lokalizacja:Kotlarka
Offline

Napisano 16.07.2017 16:25

UNION ALL podejrzewam że pyknie, chodzi o to że mam 3 tabele

gracze: id_gracza, steamid, ranga, pkt_stat - każdy gracz ma swój wpis w tej tabeli

misje: id_misji, nazwa_misji

misje_graczy: id_gracza, id_misji, czy_zrobil (bool).

 

Zwrócić myślałem od razu:

range, pkt stat, id_misji, czy_zrobil dla danego steamid


  • +
  • -
  • 0

#10 _McHappy

    Wszechwiedzący

  • Support Team

Reputacja: 243
Wszechwidzący

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

Napisano 16.07.2017 16:45

Tu wystarczy klasyczny LEFT JOIN ;)
  • +
  • -
  • 0

#11 tytusek

    Czempion

  • Power User

Reputacja: 229
Wszechwidzący

  • Postów:822
Offline

Napisano 16.07.2017 19:11

http://it.dth.pl/sel...ql-mysql-cz-4c/

kwestia zapytania


  • +
  • -
  • 1

#12 Asiap

    Wszechpomocny

  • Girl

Reputacja: 171
Profesjonalista

  • Postów:323
  • Lokalizacja:Kętrzyn
Offline

Napisano 16.07.2017 23:01

ja pobieram dane z jednej i drugiej tabeli wedluh kolumny ID w ten sposob

SELECT a.*, b.* FROM `tabela` AS `a` INNER JOIN `tabela2` AS `b` ON a.id = b.id 


  • +
  • -
  • 1

#13 _McHappy

    Wszechwiedzący

  • Support Team

Reputacja: 243
Wszechwidzący

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

Napisano 16.07.2017 23:23

Tak, chodziło o INNER, a nie LEFT :/

UNION można zastosować, gdy masz do wczytania np. listę misji wraz z opisami i jednocześnie listę rang z wymogami (z kompletnie innej tabeli) itd. Trzeba jedynie zadbać o równą ilość kolumn zwracaną przez obie kwerendy jak i te same typy danych analogicznych kolumn.

Użytkownik _McHappy edytował ten post 16.07.2017 23:26

  • +
  • -
  • 0

#14 d0naciak

    Godlike

  • Autor tematu
  • Power User

Reputacja: 1 029
Hero

  • Postów:2 414
  • GG:
  • Steam:steam
  • Imię:Dawid
  • Lokalizacja:Kotlarka
Offline

Napisano 17.07.2017 16:51

Tak tylko nie dopowiedziałem -wpisów w tabeli misje_graczy dla danego id_gracza może być kilka, relacja wiele do wielu między misjami a graczami, więc chyba nie przejdzie dobrze myślę?


  • +
  • -
  • 0

#15 _McHappy

    Wszechwiedzący

  • Support Team

Reputacja: 243
Wszechwidzący

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

Napisano 17.07.2017 17:10

Hmmm. Możesz użyć wspomnianego INNER JOIN, lecz zestaw wynikowy zwracany przez kwerendę będzie niepotrzebnie powiększony (do każdego rekordu misji będą dopisane kolumny o stałej wartości).

UNION ma to do siebie, że rekordy są zwracane odpowiednio "jeden pod drugim". Dobrze jest też indeksować podgrupy rekordów (kolumna z ID wyniku - 1 dla wyników misji, 2 - dla statystyk gracza itp, kwestia ułatwienia przechwycenia wyników do zmiennych).


  • +
  • -
  • 1

#16 d0naciak

    Godlike

  • Autor tematu
  • Power User

Reputacja: 1 029
Hero

  • Postów:2 414
  • GG:
  • Steam:steam
  • Imię:Dawid
  • Lokalizacja:Kotlarka
Offline

Napisano 17.07.2017 17:39

To walnę UNION - pierwszy zawsze będzie wpis z tabeli gracze, reszta to wpisy z tabeli misje_graczy - jakoś pokombinuję, dzięki za podpowiedzi, do zamknięcia.


  • +
  • -
  • 0




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

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