Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: powiązanie dwóch tabel
Forum PHP.pl > Forum > PHP
mb83
Witam,
Mam stronę piłkarską.
Każda z drużyn ma swoją osobną podstronę na której są dane kontaktowe, strona www, etc ...
Chciałbym, aby na profilu tej drużyny były wyświetlane informacje takie jak newsy powiązane z tą drużyną.

Tylko, że jeśli napiszę w jakimś newsie o więcej niż jednej z drużyn to chciałbym aby przy każdej z tych drużyn był ten news.

Domyślam się, że trzeba to rozwiązać za pomocą jakiegoś jednego słowa kluczowego.

Stworzyłem przy newsie kolumnę "profil_id" i w nim wpisuję nr id danego zespołu z tabeli "profile".

Tylko, że jeśli wpiszę w niej nr id zespołu np "18" to drużyna "188" też będzie miała tego newsa. (co jest zrozumiałe, używam where like '%18%')

i tu pytanie: rozwiązanie wyżej jest dobre tylko jak to rozwiązanie zastosować jeśli wpiszę więcej id zespołów?
oddzielić je przecinkiem i explode? jak ten kod sformułować?

Bardzo proszę o pomoc, jak najprościej to rozwiązać bez zbędnych komplikacji.
Dzięki za wyrozumiałość.
Pyton_000
Tworzysz kolejną tabelę z relacją 1..n zespołu i newsa.
Do newsa "zaznaczasz" kluby których dotyczy. Przykładowe wpisy w takiej tabeli

Kod
id_zespolu | id_newsa
1 | 2
1 | 4
2 | 2
2 | 6
mb83
To mam 3 tabele połączyć? Jak skonstruować zapytanie SQL aby na stronie zespołu były newsy z nimi powiazane?
Pyton_000
  1. SELECT pola_newsów FROM newsy JOIN tabela_powiązana ON(tabela_powiązana.id_newsa = newsy.id AND tabela_powiązana.id_zespolu = 999)

Dostajesz wszystkie newsy dla zespołu id = 999
mb83
Dzięki, fajnie działa.
Tylko co, jeśli w kolumnie "tabela_powiązana.id_newsa" muszę wpisać więcej id.

Bo to co napisałeś działa przy jednym wpisie ale gdy id jest więcej?

  1. tabela_powiązana.id_newsa
  2. 1, 2, 31, 4
SmokAnalog
Interesujące Cię ID wrzuca się do WHERE, a nie do ON, bo to selekcja rekordów, a nie warunek samego powiązania:
  1. SELECT `n`.*,
  2. `t`.*
  3. FROM `newsy_zespoly` AS `nz`
  4. JOIN `newsy` AS `n`
  5. ON `n`.`id` = `nz`.`id_newsa`
  6. JOIN `zespoly` AS `z`
  7. ON `z`.`id` = `nz`.`id_zespolu`
  8. WHERE `n`.`id` IN (1, 2, 31, 4)
  9. AND `z`.`id` IN (7, 9);
mb83
nie za bardzo to działa,
może "narysuję" o co mi chodzi.
tabela "newsy"
  1. id | tytul | skrot | id_zespol


tabela_katalog

  1. id | nazwa | id_news


i teraz jest taka sytuacja.

  1. news:
  2. id | tytul | skrot | id_zespol
  3. 1 | ble ble | ble ble | 112, 135, 136


  1. zespół:
  2. id | nazwa | id_news
  3. 112 | ble | 1, 30
  4. 135 | ble2 | 1, 25
  5. 136 | ble2 | 35, 42, 1


innymi słowy:
jak jednego newsa przypisać do wielu zespłów i wypisać tego newsa przy każdym z zespołów?

mam nadzieję, że teraz jest bardziej obrazowo ;-)
dzięki za wyrozumiałość.
SmokAnalog
Zakładam, że jeden news może dotyczyć kilku zespołów jednocześnie, bo tylko wtedy mówimy o relacji wiele do wielu i potrzebujemy tabeli łączącej.

Tabela z newsami nie powinna nic wiedzieć o zespołach, a tabela z zespołami o newsach.

Tabela `newsy`:
Kod
id | tytul | skrot


Tabela `zespoly`:
Kod
id | nazwa


Tabela łącząca, ja lubię je nazywać w stylu `newsy_zespoly`:
Kod
id | id_newsa | id_zespolu


Warto zapoznać się z tematem kluczy obcych. Wtedy możesz np. zrobić tak, że przy usunięciu danego zespołu zawsze usunie się automatycznie jego przypisanie do newsa.

Przykładowe dane:

Tabela `newsy`:
Kod
1 | Była spajsetka nie myje włosów! | Ble.
2 | Iron Maiden i Spice Girls łączą się! | Szok i niedowierzanie.


Tabela `zespoly`:
Kod
1 | Iron Maiden
2 | Spice Girls


Tabela `newsy_zespoly`
Kod
1 | 1 | 2
2 | 2 | 1
3 | 2 | 2


Przeanalizuj zawartość tabeli `newsy_zespoly`. Pierwszy news jest połączony z zespołem Spice Girls, a drugi z Iron Maiden i Spice Girls jednocześnie.
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.