Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] praca na powiązanych tabelach
Forum PHP.pl > Forum > Przedszkole
sauron9
Witam, mam 2 połączone relacją tabele w bazie:

| id | imie | nazwisko | klub |

| id | klub | trener | adres |

powiązane poprzez klub.

I tutaj mój problem: jak mam zapisywać, odczytywać, usuwać i modyfikować dane w bazie, tak aby te relacje były zachowane (np wprowadzając do bazy osobę za pomocą jednego formularza z tego samego klubu zeby nie dodawało klubu do tabeli nr 2 po raz drugi? lub jak pobrać odpowiadające sobie dane z obu tabel za pomocą jednego zapytania?)? Nie mam dostępu do zadnej literatury, a kursy w internecie nic nie mówią o InnoDB i są raczej w tym temacie ubogie.

Dzieki za pomoc. Pozadrawiam
Cienki1980
To że jest to InnoDB to nic nie zmienia.

Pobieranie danych to po prostu wykonanie JOIN'a czyli :
  1. SELECT * FROM table1 LEFT JOIN table2 ON table1.klub=table2.klub


Kolumny "klub" jakiego są typu questionmark.gif Ja bym relacje zrobił po id tabeli drugiej wpisywanej do tabeli pierwszej.

Co do dodawania to dodajesz do tabeli pierwszej tabeli dane podając klub wybierajac go z listy, która została stworzona na podstawie danych z tabeli drugiej.
JaRoPHP
Cytat
Nie mam dostępu do zadnej literatury, a kursy w internecie nic nie mówią o InnoDB i są raczej w tym temacie ubogie
Akurat w tej kwesti, nie ma wielkiej różnicy, czy używasz tabel InnoDB, czy też nie.

Zapisywanie danych - do każdej tabeli osobno, przy czym nie możesz wstawić do tabeli klucza obcego, jeżeli w tabeli do której się on odwołuje, nie ma odpowiednika (czyli wstawiasz najpierw tam, gdzie jest klucz główny).
Odczytywanie - za pomocą składni SELECT, z dodatkiem składni JOIN.
Usuwanie - w zależności czy zadeklarowałeś ON DELETE, baza zrobi to za Ciebie, albo usuwasz ręcznie.
Modyfikacja - j.w. (z tym, że ON UPDATE).

[EDIT] do postu poniżej
Niestety nie wiem jaki jest zamysł autora.
Początkowo przyjąłem, że są tabele: klub i zawodnicy (mająca pole klub, będący kluczem obcym). Wtedy np. zmiana nazwy klubu aktualizowałaby dane.
Ale autor chyba troszkę inaczej zaprojektował tę tabelę, więc zgodzę się z Twoją uwagą AxZx
AxZx
a na czym polega modyfikacja zakladajac ze jest zadeklorowane ON UPDATE?
dla struktury ktora podal autor tematu.

modyfikuje dane w pierwszej tabeli to co sie zmieni w drugiej? po co jest ON UPDATE?
sauron9
JaRoPHP -> moj zamysl jest taki, ze mam baze zawodnikow i baze klubow. zawodnikow jest wielu, a klubow jest kilka, kazdy zawodnik nalezy do jakiegos klubu, z tabeli "kluby".
Teraz pojawil sie nastepny problem: zmienilem troszke tabele, teraz wyglada nastepująco:

| id | imie | nazwisko | id_klub | - tabela zawodnicy

| id_klub | klub | trener | adres | - tabela kluby

id_klub w tabeli "kluby" jest auto_increment, i powiazanie jest poprzez to wlasnie pole. Z wyciąganiem danych z bazy nie ma problemu, jednakże mam problem z dodawaniem. Dodaję najpierw zapytaniem wpis do tabeli "kluby", i jak mam więc dodać dane do tabeli "zawodnicy" nie znając w chwili dodawania wartości id_klubu ? Mam wartosc tego pola sprawdzic wyszukując na podstawie nazwy klubu?

dzieki za dpowiedz, pozdrawiam
Cienki1980
Skoro najpierw dodajesz wiersz do tabeli klub to potem możesz w php wyciągnąć stworzone id.
Zrobisz to za pomocą funkcji [u]mysql_insert_id()[/b]

Mając id wstawionego klubu możesz wstawić je do tabeli z piłkarzami.
sauron9
Dziękuję,
no i ostatnie nurtujące mnie pytanie: co zrobić, aby klub nie został dodany po raz drugi do bazy? chciałem zrobić pole "klub" jako UNIQUE, ale nie mogę, sql mi na to nie pozwala. pole to jest typu TEXT. a wywala komunikat taki:

#1170 - BLOB/TEXT column 'klub' used in key specification without a key length

Próbowałem ustawić długość na różne wartości, ale tez nie działa.
Cienki1980
Możesz sprawdzić w php. Podczas dodawania nowego klubu możesz wyciągnąć wszystkie kluby, które są aktualnie w bazie i porównać z nowo dodawanym wpisem.

Jeżeli znajdziesz pasujący wpis to nie dodajesz nowego klubu, jeżeli żaden wpis z bazy nie przypasuje dodasz nowy klub.
AxZx
aby sprawdzic czy dany klub jest w bazie mozesz zrobic tak:

  1. SELECT count(*) AS ile FROM kluby WHERE nazwa = $nazwa


jezeli wynik tego zapytania jest wiekszy od 0 tzn ze jest taki klub w bazie, jezeli nie ma to mozesz go dodac bo takiego jeszcze nie ma.
Cienki1980
Sposób AxZx jest stanowczo szybszy ... o tym nie pomyślałem.
sauron9
Już wiem wszystko co było mi potrzebne. Dziękuję za pomoc.
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.