Wczytyanie danych z bazy "na raz"
Best Answer _McHappy 16.07.2017 10:19
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ą ), 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?
_McHappy
15.07.2017
Edited by _McHappy, 15.07.2017 20:49.
_McHappy
15.07.2017
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...
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.
Best Answer
_McHappy
16.07.2017
tytusek
16.07.2017
jak używasz kluczy obcych to możesz przez INNER JOIN połączyć i w jednym zapytaniu 2 tabele wczytac
Ogen Dogen
16.07.2017
Jak możesz to podaj strukturę tych tabel, ale wydaje mi się że zwykły JOIN wystarczy.
_McHappy
16.07.2017
Edited by _McHappy, 16.07.2017 14:53.
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
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
_McHappy
16.07.2017
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.
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ę?
_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).
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.