Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Join i tabela przejściowa, Pytanie od raczkującego nowicjusza.
bp.sushi
post
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 7.05.2012

Ostrzeżenie: (0%)
-----


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ść (IMG:style_emoticons/default/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ć.

Ten post edytował bp.sushi 7.05.2012, 16:28:26
Go to the top of the page
+Quote Post
kontur
post
Post #2





Grupa: Zarejestrowani
Postów: 36
Pomógł: 6
Dołączył: 3.04.2012

Ostrzeżenie: (0%)
-----


latwiej bedzie Ci to ugryzc z 2 strony czyli- niech tabela misji przechowuje jeszcze jedna kolumne- liste osob ktore braly w niej udzial...
Go to the top of the page
+Quote Post
Niktoś
post
Post #3





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


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.

Ten post edytował Niktoś 7.05.2012, 16:43:31
Go to the top of the page
+Quote Post
bp.sushi
post
Post #4





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 7.05.2012

Ostrzeżenie: (0%)
-----


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

Ten post edytował bp.sushi 7.05.2012, 16:52:56
Go to the top of the page
+Quote Post
Niktoś
post
Post #5





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


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.

Ten post edytował Niktoś 7.05.2012, 16:53:41
Go to the top of the page
+Quote Post
Crozin
post
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
bp.sushi
post
Post #7





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 7.05.2012

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif) )

Ten post edytował bp.sushi 7.05.2012, 16:58:00
Go to the top of the page
+Quote Post
pmir13
post
Post #8





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 19:50