Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: sql LEFT OUTER JOIN
Forum PHP.pl > Forum > PHP
damianooo
Mam takie dwie tabele:

"Mecz":

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

"Typ":
(typ_gospodarz) (typ_gosc) (id_mecz) (id_gracz) (id_kolejka)



W tabeli "Typ" dla użytkownika o ID = 3 nie ma obecnie żadnych danych ponieważ jeszcze nie typował

I teraz tak. Chciałem aby zapytanie pobrało warto¶ci NULL dzięki zł±czeniu LEFT OUTER JOIN

Poniższe zapytanie nie wy¶wietla nic. Dlaczego ?
Co w tym zapytaniu jest nie tak: ?
  1. SELECT m.id,t.typ_gospodarz,t.typ_gosc
  2. FROM test_specjalny.mecz m
  3. LEFT OUTER JOIN test_specjalny.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 = 3)
  6. ORDER BY m.id
  7. ASC
Crozin
W tabeli typ, nie ma rekordu z id gracza równym 3, a w zapytaniu jasno okre¶lasz, że t.id_gracz ma być wła¶nie równe trzy - st±d brak rekordów.
rzymek01
nic nie wy¶wietla, ponieważ w zapytanie nadrzędnym w klauzuli where masz warunek t.id_gracz = 3, a sam napisałes, że nie ma takiego wpisu,
dostałby¶ NULLe gdyby zapytanie nadrzędne zwróciło jaki¶ zbiór i warunki zł±czenia nie mogłyby być spełnione
damianooo
ok to mam jeszcze tabelę "Gracz"

"Gracz":

(id)
1
2
3
4
5
6

czy powinienem zł±czyć 3 tabele aby uzyskać oczekiwane wyniki ? Przecież musi być sposób aby wy¶wietlić NULLe.

Jak to powinienem zrobić? Chodzi o to że mam panel admina i chciałbym na stronie wy¶wietlić INPUTy w których byłyby puste pola w miejscach gdzie użytkownicy nie obstawili jeszcze meczy. Inputy chcę wy¶wietlić za pomoc± pętli FOR ( będzie ich duża ilo¶ć ). Mam problem z podaniem odpowiedniego zapytania aby mi się to ładnie wy¶wietliło na stronie w rzędach.


Takie zapytanie też nie daje oczekiwanych rezultatów:

  1. SELECT m.id,t.typ_gospodarz,t.typ_gosc
  2. FROM test_specjalny.mecz m
  3. LEFT OUTER JOIN test_specjalny.typ t
  4. ON (m.id = t.id_mecz) AND (m.id_kolejka = t.id_kolejka)
  5. LEFT OUTER JOIN test_specjalny.gracz g
  6. ON t.id_gracz = g.id
  7. WHERE (m.id_kolejka = 1)
  8. ORDER BY m.id
  9. ASC



Proszę o podpowiedĽ..

dzięki
rzymek01
nie mam pod ręka± konsoli mysql, a więc zapodam pewn± ideę:

  1. SELECT
  2. m.id
  3. FROM
  4. test_specjalny.mecz m
  5. WHERE
  6. NOT EXISTS (
  7. SELECT 1 FROM test_specjalny.typ t WHERE t.id_gracz = 3 AND m.id = t.id_mecz
  8. )


na polski:
wybierz te mecze, których nie obstawił gracz o id równym 3

damianooo
wszystko fajnie tylko, że ja muszę wy¶wietlić tak dla każdego z 10 graczy i 10 meczy z każdej kolejki i musi być w następuj±cy sposób: typ_gospodarz - typ_gosc . Chcę by inputy były puste jak gracz nie obstawił i st±d potrzeba tego zapytania ze zł±czeniem LEFT OUTER JOIN aby wy¶wietlił mi się NULLe

  1. mecz gracz1 gracz2 gracz3 gracz4
  2. 1 <input>1-1</input> <input>2-2</input> <input>null</input> <input>null</input>
  3. 2 <input>1-1</input> <input>2-2</input> <input>null</input> <input>null</input>
  4. 3 <input>1-1</input> <input>2-2</input> <input>null</input> <input>null</input>
  5. 4 <input>1-1</input> <input>2-2</input> <input>null</input> <input>null</input>
  6. 5 <input>1-1</input> <input>2-2</input> <input>null</input> <input>null</input>
  7. 6 <input>1-1</input> <input>2-2</input> <input>null</input> <input>null</input>
  8. 7 <input>1-1</input> <input>2-2</input> <input>null</input> <input>null</input>
  9. 8 <input>1-1</input> <input>2-2</input> <input>null</input> <input>null</input>
  10. 9 <input>1-1</input> <input>2-2</input> <input>null</input> <input>null</input>
  11. 10 <input>1-1</input> <input>2-2</input> <input>null</input> <input>null</input>



więc zapytanie potrzebuję mieć w instrukcji FOR

  1. FOR($i=0;$i<10;$i++){
  2.  
  3. SELECT m.id,t.typ_gospodarz,t.typ_gosc
  4. FROM test_specjalny.mecz m
  5. LEFT OUTER JOIN test_specjalny.typ t
  6. ON (m.id = t.id_mecz) AND (m.id_kolejka = t.id_kolejka)
  7. WHERE (m.id_kolejka = 1) AND (t.id_gracz = ".$i.")
  8. ORDER BY m.id
  9. ASC
  10.  
  11. }


twoje zapytanie tutaj chyba nie pomoże ... a może się mylę ?
lukaskolista
  1. <input>null</input>
WTF? Podziwiam ludzi, ktorzy biora sie za pisanie gier nie znajac podstawowych podstaw.

Moze glupie pytanie, ale musze je zadac. Czy petla for wyglada tak, jak nam ja przedstawiles, czy moze zapytanie SQL jest jednak w apostrofach/cudzyslowiach?
damianooo
lukaskolista nie! nie tak wygl±da w rzeczywisto¶ci.

Na prawdę wygl±da to tak:


  1. <?php
  2.  
  3. for($a=0;$a<count($arrayUserId);$a++){
  4.  
  5. $sql_mecz = "SELECT m.id,t.typ_gospodarz,t.typ_gosc FROM test_specjalny.mecz m LEFT OUTER JOIN test_specjalny.typ t ON (m.id = t.id_mecz) AND (m.id_kolejka = t.id_kolejka) WHERE (m.id_kolejka = 1) AND (t.id_gracz = ".$arrayUserId[$a].") ORDER BY m.id ASC";
  6. $result_mecz = mysql_query($sql_mecz);
  7. while ($row_mecz = mysql_fetch_array($result_mecz))
  8. {
  9. $typ_gospodarz = $row_mecz['typ_gospodarz'];
  10. $typ_gosc = $row_mecz['typ_gosc'];
  11. ?>
  12.  
  13. <div>
  14. <?php echo $typ_gospodarz.' - '.$typ_gosc; ?>
  15. </div>
  16.  
  17. <?php
  18. }
  19. }
  20. ?>



podałem baaaardzo uproszczony przykład żeby wiadomo było co chcę uzyskać.
rzymek01
a próbowałe¶ odpalić moje zapytanie?

jak dasz pliczek sql z tabelami i danymi, które będę mógł sobie zaimportować do bazy, to w wolnej chwili pobawię się tym zapytaniem smile.gif
damianooo
ok rzemek01

  1. --
  2. -- Struktura tabeli dla `gracz`
  3. --
  4.  
  5. CREATE TABLE IF NOT EXISTS `gracz` (
  6. `id` int(11) NOT NULL AUTO_INCREMENT,
  7. `nazwa` varchar(30) COLLATE utf8_polish_ci NOT NULL,
  8. `haslo` varchar(30) COLLATE utf8_polish_ci NOT NULL,
  9. `il_zw` int(11) NOT NULL,
  10. `nr_spec` int(11) NOT NULL,
  11. `stat` int(2) NOT NULL,
  12. PRIMARY KEY (`id`)
  13. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=15 ;
  14.  
  15. --
  16. -- Zrzut danych tabeli `gracz`
  17. --
  18.  
  19. INSERT INTO `gracz` (`id`, `nazwa`, `haslo`, `il_zw`, `nr_spec`, `stat`) VALUES
  20. (1, 'Damian', 'DDDAMMM', 0, 10, 1),
  21. (2, 'Wojtek', 'WOOOTK', 2, 1, 1),
  22. (3, 'Mateusz', 'MMMTTT', 0, 6, 1),
  23. (4, 'Adam', 'MCCNN', 0, 2, 1),
  24. (5, 'Krystian', 'KKRRRYYY', 0, 8, 1),
  25. (6, 'Piotrek', 'PPPKKK', 0, 7, 1),
  26. (7, 'Tomek', 'kkk', 0, 11, 0),
  27. (8, 'Michał', 'MHHLL', 0, 4, 1),
  28. (9, 'Marcin', 'ADDDM', 0, 9, 1),
  29. (10, 'Przemek', 'PPPMMMKKK', 0, 5, 1),
  30. (11, 'Łukasz', 'LLKKSS', 0, 3, 1),
  31. (14, 'Darek', 'DDAARR', 0, 12, 0);



  1. --
  2. -- Struktura tabeli dla `mecz`
  3. --
  4.  
  5. CREATE TABLE IF NOT EXISTS `mecz` (
  6. `id` int(11) NOT NULL AUTO_INCREMENT,
  7. `gospodarz` varchar(50) COLLATE utf8_polish_ci NOT NULL,
  8. `gosc` varchar(50) COLLATE utf8_polish_ci NOT NULL,
  9. `skr_gospodarz` varchar(25) COLLATE utf8_polish_ci NOT NULL,
  10. `skr_gosc` varchar(25) COLLATE utf8_polish_ci NOT NULL,
  11. `br_gospodarz` int(11) NOT NULL,
  12. `br_gosc` int(11) NOT NULL,
  13. `opis` varchar(50) COLLATE utf8_polish_ci NOT NULL,
  14. `termin` varchar(50) COLLATE utf8_polish_ci NOT NULL,
  15. `pozycja` int(11) NOT NULL,
  16. `status_m` int(11) NOT NULL,
  17. `kolor` int(11) NOT NULL,
  18. `id_kolejka` int(11) NOT NULL,
  19. PRIMARY KEY (`id`)
  20. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=178 ;
  21.  
  22. --
  23. -- Zrzut danych tabeli `mecz`
  24. --
  25.  
  26. INSERT INTO `mecz` (`id`, `gospodarz`, `gosc`, `skr_gospodarz`, `skr_gosc`, `br_gospodarz`, `br_gosc`, `opis`, `termin`, `pozycja`, `status_m`, `kolor`, `id_kolejka`) VALUES
  27. (163, 'Austria', 'Niemcy', 'Austria', 'Niemcy', 0, 0, 'el. M¦ Brazylia 2014 ,Grupa C', 'Wtorek, 11-09-2012, godz. 21:00', 6, 1, 1, 2),
  28. (159, 'Anglia', 'Ukraina', 'Anglia', 'Ukraina', 0, 0, 'el. M¦ Brazylia 2014 ,Grupa H', 'Wtorek, 11-09-2012, godz. 21:00', 2, 0, 1, 2),
  29. (160, 'Szkocja', 'Macedonia', 'Szkocja', 'Macedonia', 0, 0, 'el. M¦ Brazylia 2014 ,Grupa A', 'Wtorek, 11-09-2012, godz. 21:00', 3, 1, 1, 2),
  30. (161, 'Belgia', 'Chorwacja', 'Belgia', 'Chorwacja', 0, 0, 'el. M¦ Brazylia 2014 ,Grupa A', 'Wtorek, 11-09-2012, godz. 21:00', 4, 0, 1, 2),
  31. (171, 'Urugwaj', 'Ekwador', 'Urugwaj', 'Ekwador', 0, 0, 'el. M¦ Brazylia 2014 ,Ameryka Płd.', 'Wtorek, 11-09-2012, godz. 23:30', 14, 1, 1, 2),
  32. (167, 'Grecja', 'Litwa', 'Grecja', 'Litwa', 0, 0, 'el. M¦ Brazylia 2014 ,Grupa G', 'Wtorek, 11-09-2012, godz. 21:00', 10, 1, 1, 2),
  33. (164, 'Węgry', 'Holandia', 'Węgry', 'Holandia', 0, 0, 'el. M¦ Brazylia 2014 ,Grupa D', 'Wtorek, 11-09-2012, godz. 21:00', 7, 1, 1, 2),
  34. (177, 'Górnik Zabrze', 'Legia Warszawa', 'Górnik Z.', 'Legia W.', 0, 0, 'Liga polska', 'Sobota, 15-09-2012, godz. 18:00', 20, 0, 1, 2),
  35. (176, 'Sevilla FC', 'Real Madryt', 'Sevilla FC', 'Real Madryt', 0, 0, 'Liga hiszpańska', 'Niedziela, 16-09-2012, godz. 21:00', 19, 0, 1, 2),
  36. (175, 'Espaniol Barcelona', 'Athletic Bilbao', 'Espaniol', 'A. Bilbao', 0, 0, 'Liga hiszpańska', 'Niedziela, 16-09-2012, godz. 21:00', 18, 0, 1, 2),
  37. (174, 'Borussia Dortmund', 'Bayer Leverkusen', 'Borussia D.', 'Bayer L.', 0, 0, 'Liga niemiecka', 'Sobota, 15-09-2012, godz. 15:30', 17, 0, 1, 2),
  38. (173, 'Peru', 'Argentyna', 'Peru', 'Argentyna', 0, 0, 'el. M¦ Brazylia 2014 ,Ameryka Płd.', '¦roda, 12-09-2012, godz. 03:25', 16, 1, 1, 2),
  39. (156, 'Kolumbia', 'Urugwaj', 'Kolumbia', 'Urugwaj', 0, 0, 'el. M¦ Brazylia 2014 ,Ameryka Płd.', 'Sobota, 08-09-2012, godz. 00:20', 9, 1, 1, 1),
  40. (157, 'Ekwador', 'Boliwia', 'Ekwador', 'Boliwia', 0, 0, 'el. M¦ Brazylia 2014 ,Ameryka Płd.', 'Pi±tek, 07-09-2012, godz. 23:00', 10, 1, 1, 1),
  41. (172, 'Chile', 'Kolumbia', 'Chile', 'Kolumbia', 0, 0, 'el. M¦ Brazylia 2014 ,Ameryka Płd.', 'Wtorek, 11-09-2012, godz. 21:30', 15, 1, 1, 2),
  42. (151, 'Dania', 'Czechy', 'Dania', 'Czechy', 0, 0, 'el. M¦ Brazylia 2014 ,Grupa B', 'Sobota, 08-09-2012, godz. 21:00', 4, 1, 1, 1),
  43. (152, 'Holandia', 'Turcja', 'Holandia', 'Turcja', 0, 0, 'el. M¦ Brazylia 2014 ,Grupa D', 'Pi±tek, 07-09-2012, godz. 21:00', 5, 1, 1, 1),
  44. (153, 'Finlandia', 'Francja', 'Finlandia', 'Francja', 0, 0, 'el. M¦ Brazylia 2014 ,Grupa I', 'Pi±tek, 07-09-2012, godz. 21:00', 6, 1, 1, 1),
  45. (154, 'Brazylia', 'RPA', 'Brazylia', 'RPA', 0, 0, 'mecz towarzyski', 'Pi±tek, 07-09-2012, godz. 21:00', 7, 1, 1, 1),
  46. (155, 'Argentyna', 'Paragwaj', 'Argentyna', 'Paragwaj', 0, 0, 'el. M¦ Brazylia 2014 ,Ameryka Płd.', 'Sobota, 08-09-2012, godz. 01:10', 8, 1, 1, 1),
  47. (170, 'Francja', 'Białoru¶', 'Francja', 'Białoru¶', 0, 0, 'el. M¦ Brazylia 2014 ,Grupa I', 'Wtorek, 11-09-2012, godz. 21:00', 13, 0, 1, 2),
  48. (169, 'Gruzja', 'Hiszpania', 'Gruzja', 'Hiszpania', 0, 0, 'el. M¦ Brazylia 2014 ,Grupa I', 'Wtorek, 11-09-2012, godz. 21:00', 12, 1, 1, 2),
  49. (168, 'Bo¶nia i H.', 'Łotwa', 'Bo¶nia i H.', 'Łotwa', 0, 0, 'el. M¦ Brazylia 2014 ,Grupa G', 'Wtorek, 11-09-2012, godz. 21:00', 11, 1, 1, 2),
  50. (166, 'Izrael', 'Rosja', 'Izrael', 'Rosja', 0, 0, 'el. M¦ Brazylia 2014 ,Grupa F', 'Wtorek, 11-09-2012, godz. 21:00', 9, 0, 1, 2),
  51. (165, 'Norwegia', 'Słowenia', 'Norwegia', 'Słowenia', 0, 0, 'el. M¦ Brazylia 2014 ,Grupa E', 'Wtorek, 11-09-2012, godz. 21:00', 8, 0, 1, 2),
  52. (162, 'Bułgaria', 'Armenia', 'Bułgaria', 'Armenia', 0, 0, 'el. M¦ Brazylia 2014 ,Grupa B', 'Wtorek, 11-09-2012, godz. 21:00', 5, 0, 1, 2),
  53. (158, 'Polska', 'Mołdawia', 'Polska', 'Mołdawia', 0, 0, 'el. M¦ Brazylia 2014 ,Grupa H', 'Wtorek, 11-09-2012, godz. 21:00', 1, 1, 1, 2),
  54. (150, 'Bułgaria', 'Włochy', 'Bułgaria', 'Włochy', 0, 0, 'el. M¦ Brazylia 2014 ,Grupa B', 'Pi±tek, 07-09-2012, godz. 21:00', 3, 1, 1, 1),
  55. (149, 'Szkocja', 'Serbia', 'Szkocja', 'Serbia', 0, 0, 'el. M¦ Brazylia 2014 ,Grupa A', 'Sobota, 08-09-2012, godz. 21:00', 2, 1, 1, 1),
  56. (148, 'Czarnogóra', 'Polska', 'Czarnogóra', 'Polska', 0, 0, 'el. M¦ Brazylia 2014, Grupa H', 'Pi±tek, 07-09-2012, godz. 21:00', 1, 1, 1, 1);





  1. --
  2. -- Struktura tabeli dla `typ`
  3. --
  4.  
  5. CREATE TABLE IF NOT EXISTS `typ` (
  6. `id` int(11) NOT NULL AUTO_INCREMENT,
  7. `typ_gospodarz` int(11) NOT NULL,
  8. `typ_gosc` int(11) NOT NULL,
  9. `data_typ` date NOT NULL,
  10. `id_mecz` int(11) NOT NULL,
  11. `id_gracz` int(11) NOT NULL,
  12. `id_kolejka` int(11) NOT NULL,
  13. PRIMARY KEY (`id`)
  14. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=500 ;
  15.  
  16. --
  17. -- Zrzut danych tabeli `typ`
  18. --
  19.  
  20. INSERT INTO `typ` (`id`, `typ_gospodarz`, `typ_gosc`, `data_typ`, `id_mecz`, `id_gracz`, `id_kolejka`) VALUES
  21. (499, 2, 2, '2012-07-26', 157, 2, 1),
  22. (498, 2, 2, '2012-07-26', 156, 2, 1),
  23. (497, 2, 2, '2012-07-26', 155, 2, 1),
  24. (496, 2, 2, '2012-07-26', 154, 2, 1),
  25. (495, 2, 2, '2012-07-26', 153, 2, 1),
  26. (494, 2, 2, '2012-07-26', 152, 2, 1),
  27. (493, 2, 2, '2012-07-26', 151, 2, 1),
  28. (492, 2, 2, '2012-07-26', 150, 2, 1),
  29. (491, 2, 2, '2012-07-26', 149, 2, 1),
  30. (490, 2, 2, '2012-07-26', 148, 2, 1),
  31. (489, 1, 1, '2012-07-25', 157, 1, 1),
  32. (488, 1, 1, '2012-07-25', 156, 1, 1),
  33. (487, 1, 1, '2012-07-25', 155, 1, 1),
  34. (486, 1, 1, '2012-07-25', 154, 1, 1),
  35. (485, 1, 1, '2012-07-25', 153, 1, 1),
  36. (484, 1, 1, '2012-07-25', 152, 1, 1),
  37. (483, 1, 1, '2012-07-25', 151, 1, 1),
  38. (482, 1, 1, '2012-07-25', 150, 1, 1),
  39. (481, 1, 1, '2012-07-25', 149, 1, 1),
  40. (480, 1, 1, '2012-07-25', 148, 1, 1);
rzymek01
nie mogłe¶ tego wrzucić na jaki¶ zewnętrzny serwer? smile.gif

a za literówkę w nicku karny jeżyk

PS.

sprawdziłem,
moje zapytanie, co podałem wyżej, działa, aż sam się zdziwiłem, bo pisałem z głowy tongue.gif

ale rozumie, że tobie chodzi o wy¶wietlenie typów gracza na każdy mecz dla każdego z gracza

chodzi Ci o co¶ takiego:
  1. SELECT
  2. m.id, t.typ_gospodarz
  3. FROM
  4. mecz m
  5. LEFT JOIN
  6. typ t
  7. ON
  8. m.id = t.id_mecz AND t.id_gracz =2
damianooo
chyba mi Stary pomogłe¶ ale przetestuję to póĽniej jak wrócę z pracy wink.gif i dam Ci "plus"
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.