Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: sql - złączenie 3 tabel
Forum PHP.pl > Forum > PHP
damianooo
Witam,

Mam następujące tabele:

  1. mecz(
  2. `id`,
  3. `gospodarz`,
  4. `gosc`,
  5. `skr_gospodarz`,
  6. `skr_gosc`,
  7. `br_gospodarz`,
  8. `br_gosc`,
  9. `opis`,
  10. `termin`,
  11. `pozycja`,
  12. `status_m`,
  13. `kolor`,
  14. `id_kolejka`,
  15. PRIMARY KEY (`id`)
  16. )
  17.  
  18. typ (
  19. `id`,
  20. `typ_gospodarz`,
  21. `typ_gosc`,
  22. `data_typ`,
  23. `id_mecz`,
  24. `id_gracz`,
  25. `id_kolejka`,
  26. PRIMARY KEY (`id`)
  27. )
  28.  
  29. punkty (
  30. `id`,
  31. `punkty`,
  32. `id_gracz`,
  33. `id_mecz`,
  34. `id_kolejka`,
  35. PRIMARY KEY (`id`)
  36. )



Czy takie zapytanie łączące wszystkie 3 tabele jest ok?

  1. SELECT m.id,m.gospodarz,m.gosc,m.br_gospodarz,m.br_gosc,p.punkty,t.typ_gospodarz,t.typ_gosc
  2. FROM mecz m
  3. INNER JOIN typ t
  4. ON (m.id = t.id_mecz) AND (m.id_kolejka = t.id_kolejka)
  5. INNER JOIN punkty p
  6. ON (m.id = p.id_mecz) AND (m.id_kolejka = p.id_kolejka) AND (m.id = t.id_mecz) AND (m.id_kolejka = t.id_kolejka) AND
  7. (p.id_mecz = t.id_mecz) AND (p.id_kolejka = t.id_kolejka) AND (p.id_gracz = t.id_gracz)
  8. WHERE (m.id_kolejka = 1) AND (t.id_gracz = 1) AND (m.status_m = 1)
  9. ORDER BY m.id ASC



Czemu otrzymuję pusty wynik? Co robię źle? Dodam że wszystkie tabele są wypełnione danymi. Dodam też że łączenie 2 dowolnych tabel działa.

dzięki
CuteOne
Jeżeli coś nie działa w zapytaniu wstaw na jego końcu raportowanie błędów
  1. mysql_query(zapytanie) or die(mysql_error());
damianooo
Zrobiłem tak jak zaproponowałeś:

  1. $sql = "SELECT m.id,m.gospodarz,m.gosc,m.br_gospodarz,m.br_gosc,p.punkty,t.typ_gospodarz,t.typ_
    gosc FROM mecz m INNER JOIN typ t ON (m.id = t.id_mecz) AND (m.id_kolejka = t.id_kolejka) INNER JOIN punkty p ON (m.id = p.id_mecz) AND (m.id_kolejka = p.id_kolejka) AND (m.id = t.id_mecz) AND (m.id_kolejka = t.id_kolejka) AND (p.id_mecz = t.id_mecz) AND (p.id_kolejka = t.id_kolejka) AND (p.id_gracz = t.id_gracz) WHERE (m.id_kolejka = 1) AND (t.id_gracz = 1) AND (m.status_m = 1) ORDER BY m.id ASC"
    ;
  2.  
  3. $result = mysql_query($sql) OR die(mysql_error());
  4. echo $result;


Wynik wyświetlił mi się taki:

  1. Resource id #5


O co może chodzić ? Dobrze zastosowałem mysql_error() w tym przykładzie ?

Bez tego też wyświetla mi taki komunikat

Zapytanie testuję w phpmyadmin i nie wywala żadnych błędów. Otrzymuję tylko informację po wykonaniu zapytania:

  1. MySQL zwrócił pusty wynik (zero rekordów)




Najważniejsze jest czy dobrze mam skonstuowane zapytanie. W złączeniach trzeba zawsze łączyć po wszystkich możliwych tych samych kolumnach, więc chyba mam dobrze.






Testuję po 2 złączenia na tych trzech tabelach i tak:

Złącznie tabeli mecz i typ działa ok (wyswietla rekordy):

  1. SELECT m.id,m.gospodarz,m.gosc,m.br_gospodarz,m.br_gosc,t.typ_gospodarz,t.typ_gosc
  2. FROM mecz m
  3. INNER JOIN typ t
  4. ON (m.id = t.id_mecz) AND (m.id_kolejka = t.id_kolejka)
  5. WHERE (m.id_kolejka = 1) AND (t.id_gracz = 1) AND (m.status_m = 1)
  6. ORDER BY m.id ASC


Natomiast złącznie tabeli mecz i punkty nie wyciąga rekordów i pewnie tutaj jest problem:

  1. SELECT m.id,m.gospodarz,m.gosc,m.br_gospodarz,m.br_gosc,p.punkty
  2. FROM mecz m
  3. INNER JOIN punkty p
  4. ON (m.id = p.id_mecz) AND (m.id_kolejka = p.id_kolejka)
  5. WHERE (m.id_kolejka = 1) AND (p.id_gracz = 1) AND (m.status_m = 1)
  6. ORDER BY m.id ASC




Wiem, że za długi POST ale może uda się komuś dowiedzieć co jest nie tak z tym zapytaniem powyższym złączającym tabele: mecz i punkty ?



Evinek
Poczytaj o funkcjach mysql_*.
http://php.net/manual/pl/book.mysql.php

Ogólnie użyj funkcji:
http://www.php.net/manual/pl/function.mysql-fetch-array.php
aby pobrać do tablicy wyniki. Wtedy możesz sprawdzić co masz w tej tablicy funkcją var_dump($tablica);

Również możesz sprawdzić co zwróci zapytanie w phpMyAdmin.

I tak, dobrze użyłeś mysql_error(); Jeśli nie wyświetliło błędu to jest okej - ale nie wiadomo czy zapytanie jest całkowicie poprawne.
CuteOne
1. Podałeś odp. na swoje pytanie - któryś z warunków nie został spełniony
2. Tak jak w rzeczywistym świecie w bazie danych wszystko powinno mieć swoje miejsce. W twoim wypadku masz tzw. spagetti gdzie wszystko jest pomieszane. Na twoim miejscu utworzył bym dodatkowe tabele łączące max. dwie tabele ze sobą (bez masy id_*) w ten spsób zapanujesz nad danymi a w przyszłości łatwiej będzie ci edytować tabele
damianooo
to jeszcze podpowiem cos takiego:

SELECT * FROM punkty p WHERE ( p.id_kolejka =1 ) AND ( p.id_gracz =1 ) ORDER BY p.id ASC

daje :

(punkty.id_gracz, punkty.id_mecz, punkty.id_kolejka)
1 1 1
1 2 1
1 3 1
1 4 1
1 5 1
1 6 1
1 7 1
1 8 1
1 9 1
1 10 1

SELECT * FROM mecz m WHERE (m.id_kolejka = 1) AND (m.status_m = 1) ORDER BY m.id ASC

(mecz.id, mecz.id_kolejka)
148 1
149 1
150 1
151 1
152 1
153 1
154 1
155 1
156 1
157 1

SELECT * FROM typ t WHERE (t.id_kolejka = 1) AND (t.id_gracz = 1) ORDER BY t.id ASC

(typ.id_mecz, typ.id_gracz, typ.id_kolejka)
148 1 1
149 1 1
150 1 1
151 1 1
152 1 1
153 1 1
154 1 1
155 1 1
156 1 1
157 1 1

już wiem co jest nie tak. Kolumna id_mecz w tabeli punkty nie pasują do złaczeń w pozostałymi tabelami ..

temat zamknięty ... sorry za długie wywody .. zapytanie okazuje sie prawidłowe
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.