Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobranie danych używając nazw pól
Forum PHP.pl > Forum > Bazy danych > MySQL
Kshyhoo
Witam. Mam kolejny problem, z którym nie mogę sobie poradzić. Tabele:
  1. users
  2. id | name | adv1 | adv2 | adv3 | adv4 |
  3. ---+----------+------+------+------+------+
  4. 1 | Novak | | | | |
  5. 2 | Kovalski | | | | |
  6. 3 | Cebula | | | | |
  7.  
  8. adventure
  9. id | name
  10. ---+-------------
  11. 1 | nazwa 1
  12. 2 | nazwa 2
  13. 3 | nazwa 3
  14. 4 | nazwa 4

Wyświetlam dane z tabeli name (w pustych miejscach są liczby).
I teraz pytania:
1. Czy zdołam pobrać name z tabeli adventure posiadający tylko nazwy pól z tabeli users (adv1, adv2, adv3, adv4) ?
2. Jak inaczej (lepiej) przechowywać dane dotyczące usera?
trueblue
1. Nie do końca rozumiem. Będziesz w stanie powiązać te tabele, jeśli w polach adv1-4 będą wartości odpowiadające kluczowi id z tabeli adventure.
2. Możesz powiązać tabele przez tabelę pośrednią user_adventure (pozbywasz się pól adv1-4):
Jeśli np. użytkownik 1 "ma" przygody 1 i 4, to wartości w tej tabeli będą następujące:
1,1
1,4
Jeśli dodatkowo jest ważna numeracja przygód, to w tej tabeli można dodać dodatkową kolumnę z numerem.
Dla powyższego przykładu byłoby:
1,1,1 (jeśli przygoda id=1 jest pierwsza, czyli odpowiada wypełnieniu adv1=1)
1,4,2 (jeśli przygoda id=4 jest druga, czyli odpowiada wypełnieniu adv2=4)
Kshyhoo
No właśnie takiego powiązania nie ma, więc się pytałem, czy mogę powiązać po nazwie. Czyli najlepszym rozwiązaniem będzie dodanie tabeli i łączenie po ID.
Generalnie problem jest taki. User1 odpala przygodę i zaprasza User3 i User4. Należy zanotować ich ID, wraz z datą. I to robię. Ale chcąc wyświetlić jakiekolwiek statystyki, jet już problem.

Chyba, że do tej tabeli zapiszę też nazwę przygody... ale to nieprofesjonalne ;p
trueblue
To jakie wartości obecnie przechowujesz w adv1-4, 0 lub 1?
To nie jest dobry pomysł, bo wtedy musi być założenie, że id w adventure mają zawsze numerację od 1-4 lub inną ale ciągłą.
Gdyby były tam wartości id przygód, to już lepiej. Ale ogranicza Cię to do 4-ech przygód. Najlepszym rozwiązaniem jest tabela przejściowa.
Kshyhoo
Trzymam tam statystyki, ile kto i komu.
Mógłbym zliczać rekordy, ale chciałem zrobić to jak najprościej, żeby nie ukręcić bazy... no i muszę liczyć na moje umiejętności a nie jestem profesjonalistą.

Bo w sumie mam już trzecią tabelę:
  1. drops (przechowywane ID i czas)
  2. id | adv | user1 | user2 | user3 | datetime
  3. ---+-----+-------+-------+-------+-----------
  4. 1 | 1 | 1 | 3 | 2 | 1473542311
  5. 2 | 2 | 2 | 3 | 1 | 1473600401

trueblue
Ta też powinna być rozbita.

W drops zostaje id, adv, datetime. Klucz główny na id+adv.
Dodatkowa tabela drops_user: id, adv, id_user, wartość. Klucz obcy id+adv (do drops) oraz id_user (do users).
Kshyhoo
Nie, po co rozbita. Trzymam tam ID przygody i ID userów z datą a w tabeli users miałem te staty. To ew. dla ułatwienia mógłbym dać nową tabelę do statystyk, gdzie na bieżąco uaktualniał bym stan przygód
trueblue
Dlatego, że ograniczasz liczbę userów do 3-ech i komplikujesz potencjalne zapytania.
Chyba, że specyfika "gry" jest taka, że w rozgrywce bierze udział 3-ech graczy. To już Twoja decyzja.
Kshyhoo
Graczy jest więcej, ale w rozgrywce bierze udział 2 lub 3.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.