Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Join i tabela przejściowa
Forum PHP.pl > Forum > Przedszkole
bp.sushi
Witam.
Przeszukałem forum i internet w poszukiwaniu pomocy, ale albo nie udało mi się trafić na odpowiednie wyjaśnienie, albo po prostu nie potrafię go zrozumieć.Jestem bardzo początkujący tak w tematyce php jak i MySql więc z góry proszę o wyrozumiałość smile.gif

Najbardziej zbliżonym problemem do mojego jaki odnalazłem a forum jest ten wątek:
Temat: Skladowanie danych w tabeli many to many
Niestety nie bardzo mogę się doszukać odpowiedzi jakiej poszukuję.

Przechodząc do meritum:

Mam dwie tabele:
Operatorzy:

| id | nick | imie | avatar
-------------------------------------------------
| 1 | sushi | bartek | stuff/sushiAv.jpg
-------------------------------------------------
| 2 | lolek | zbigniew | stuff/lolekAv.jpg

itd.
Oraz tabele Misje która przechowuje nazwę misji i ścieżkę do ikonki.

| id | nazwa | ikona
---------------------------------------
| 1 | misja1 | stuff/misja1.jpg
---------------------------------------
| 2 | misja2 | stuff/misja2.jpg
---------------------------------------
| 3 | misja3 | stuff/misja3.jpg
---------------------------------------
| 4 | misja4 | stuff/misja4.jpg
---------------------------------------
itd

Zarówno operatorów jak i misje przybywa i może ich dodawać admin z panelu admina. Z tym nie mam problemów.
Nie wiem natomiast jak admin mógł by przypisywać dane misje do danego operatora + jak wyświetlić je na stronie?

Z tego co udało mi się doczytać powinienem mieć trzecią tabelę w której połączył bym rekordy ale nie bardzo wiem jak by to miało wyglądać, przy założeniu, że jeden operator może mieć np przypisane trzy różne misje a drugi dwie (w zależności od tego w których brał udział)

Na mój chłopski rozum trzecia tabela powinna wyglądać mniej więcej tak (zakładając że operator Sushi brał udział w misji1, misji2 i misji4, a operator lolek w misji2 i misji3):

| id | nick | nazwa | ikona
---------------------------------------
| 1 | sushi | misja1 | stuff/misja1.jpg
---------------------------------------
| 2 | sushi | misja2 | stuff/misja2.jpg
---------------------------------------
| 3 | sushi | misja4 | stuff/misja4.jpg
---------------------------------------
| 4 | lolek | misja2 | stuff/misja2.jpg
---------------------------------------
| 5 | lolek | misja3 | stuff/misja3.jpg
---------------------------------------

Tyle że zakładając że mam 20 operatorów, a każdy brał udział minimum w 4 misjach w różnych kombinacjach i liczba ta nadal się powiększa, miał bym przeogromną tabelę. z rozsianymi po całej długości nickami.

Tabela w stylu:

| id | nick | nazwa | ikona | nazwa | ikona | nazwa | ikona

też raczej nie wchodzi w grę bo było by mnóstwo pustych pól i nawet nie wyobrażam sobie jak dodawać misje dla poszczególnych nicków (ale może się mylę..).
Poza tym, podczas dodawania/edycji danych z panelu admina za każdym razem musiały by być tworzone rekordy w dwóch różnych bazach.

Koniec końców stronie chcę osiągnać nastepujący wynik:

Zdjęcie Avatara
Nick: Sushi
Imię: Bartek
Brał udział w misjach: misja1, misja2, misja4

Czytałem o tabelach relacyjnych w nadziei że doznam oświecenia, ale chyba bez łopatologicznego wyjaśnienia nie ejstem w stanie tego zrozumieć.
kontur
latwiej bedzie Ci to ugryzc z 2 strony czyli- niech tabela misji przechowuje jeszcze jedna kolumne- liste osob ktore braly w niej udzial...
Niktoś
Po tym podsumowaniu na dole to mniej więcej zrozumiałem. O ile dobrze myślę to potrzebne Tobie są tylko dwie tabelki
Tabela użytkownicy:
id | nick | imie | avatar

i tabela Misje:
| idM | nick | NazwaMisji|Ikona

Będziesz tworzył relację pomiędzy tabelami według nicku,dlatego musi on być niepowtarzalny dla każdego użytkownika.Tzn, w tabeli użytkownicy,każdy będzie musiał mieć inny nick.
bp.sushi
A co w przyadku kiedy dana misja bedzie przypisana do kilku operatorów (jak w przypadku misji2)?
Kilka nicków w kolumnie Nick tabeli Misje? Jak wyciągnąć taki rekord i go wyświetlić dla danego operatora?

Cały cymes polega na tym, by admin przy edycji danego operatora mógł wybrać misje (jedną lub wiele) z listy już dostępnych i przypisać je do konkretnego "nicku"

może łatwiej będzie zrozumieć o co mi chodzi na już istniejącej stronce, do której na razie dodaję wszystko "ręcznie" edytując html.

www.tog.com.pl -> ludzie
Niktoś
Będziesz miał efekt taki:
idM | nick | NazwaMisji|Ikona
1 operator1 misjaA png
2 operator1 misjaB png
3 operator1 misjaC png
4 operator2 misjaA png
5 operator2 misjaD png

Operator 1-będzie zawierał misjeA,misjeB,misjeC
Operator2- będzie zawierał misjeA i misjeD
Aha chesz ,żeby misje się nie powtarzały?To sprawdzasz w tej tabeli czy taka misja już jest i nie zapisujesz rekordu do tabeli.
Crozin
Przecież tutaj będziesz mieć najzwyklejszą relację wiele-do-wielu, tj. trzy tabele: OPERATORZY (id, nick, ...), MISJE (id, nazwa, ...), OPERATORZY_MISJE (id_operatora, id_misji).
Google: https://www.google.com/search?sourceid=chro...ql+many-to-many
bp.sushi
czyli to co opisałem w pierwszym poscie jako trzecia tabela?
Nie przeszkadza więc "ogrom" danych jakie będą tam przechowywane?

Crozin:
dzięki za podpowiedź, na pewno doczytam czego jeszcze nie przeczytałem, choć tak jak pisałem puki co niewiele z tego rozumiem bez "łopatologii"

(uprzedzałem że jestem laikiem smile.gif )
pmir13
To jest klasyczna sytuacja implementacji relacji wiele do wielu przy pomocy tabeli łączącej.
Tworzysz tabelę dajmy na to misje_operatorzy, w której przechowujesz jedynie id operatorów i misji i żadnych danych więcej, jeśli dana para operator - misja może występować tylko raz to powinno to wyglądać tak:

  1. CREATE TABLE `misje_operatorzy` (
  2. `id_misji` int(11) NOT NULL,
  3. `id_operatora` int(11) NOT NULL,
  4. PRIMARY KEY (`id_misji`,`id_operatora`)
  5. )


A następnie łączysz te tabele JOINAMI by uzyskać pożądany wynik, przykładowo:

  1. SELECT o.avatar, o.nick, o.imie,
  2. COALESCE( GROUP_CONCAT( m.nazwa ), 'Brak' ) AS misje
  3. FROM operatorzy o
  4. LEFT JOIN misje_operatorzy mo ON o.id = mo.id_operatora
  5. LEFT JOIN misje m ON mo.id_misji = m.id
  6. GROUP BY o.id
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.