←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Wczytyanie danych z bazy "na raz"


Best Answer _McHappy 16.07.2017 10:19

Hmmm. W tej sytuacji kombinowałbym z operatorem UNION ALL lub UNION z dopełnieniem NULL-kolumnowym. Go to the full post

  • +
  • -
d0naciak's Photo d0naciak 15.07.2017

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?

Quote

  • +
  • -
_McHappy's Photo _McHappy 15.07.2017

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).
Edited by _McHappy, 15.07.2017 20:49.
Quote

  • +
  • -
_McHappy's Photo _McHappy 15.07.2017

@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...
Quote

  • +
  • -
d0naciak's Photo d0naciak 16.07.2017

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.

Quote

  • +
  • -
Best Answer _McHappy's Photo _McHappy 16.07.2017

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

  • +
  • -
tytusek's Photo tytusek 16.07.2017

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

Quote

  • +
  • -
Ogen Dogen's Photo Ogen Dogen 16.07.2017

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

Quote

  • +
  • -
_McHappy's Photo _McHappy 16.07.2017

Może rzeczywiście lepiej zacząć od pytania, co konkretnie ma zwrócić kwerenda (jaki jest cel jej wykonania) :D
Edited by _McHappy, 16.07.2017 14:53.
Quote

  • +
  • -
d0naciak's Photo d0naciak 16.07.2017

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

Quote

  • +
  • -
_McHappy's Photo _McHappy 16.07.2017

Tu wystarczy klasyczny LEFT JOIN ;)
Quote

  • +
  • -
Asiap's Photo Asiap 16.07.2017

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 

Quote

  • +
  • -
_McHappy's Photo _McHappy 16.07.2017

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.
Edited by _McHappy, 16.07.2017 23:26.
Quote

  • +
  • -
d0naciak's Photo d0naciak 17.07.2017

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ę?

Quote

  • +
  • -
_McHappy's Photo _McHappy 17.07.2017

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).

Quote

  • +
  • -
d0naciak's Photo d0naciak 17.07.2017

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.

Quote