Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] jak stworzyć JOIN żeby wyświetlał brakujące wartości
Forum PHP.pl > Forum > Bazy danych > MySQL
M@X
Witam.
Tworząc proste zapytanie:
  1. SELECT id, imie, nazwisko FROM gracze;

wyskakuje mi powiedzmy 1000 rekordów

Jednak posiadam drugą tabele "odznaczenia" gdzie są identyfikatory graczy + kolumna level ale nie dla każdego identyfikatora, powiedzmy jest tych rekordów tylko dla 800 graczy.

Więc tworząc poniższego JOINa wyświetli mi tylko te 800 rekordów gdzie istnieje łącznik "id"
  1. SELECT gr.id, gr.imie, gr.nazwisko, odz.level
  2. FROM gracze gr
  3. JOIN odznaczenia odz ON gr.id = odz.id;


Moje pytanie brzmi, w jaki sposób stworzyć JOINa, aby wyświetlił mi wszystkie 1000 rekordów, a tam gdzie w tabeli "odznaczenia" nie ma odpowiadającej wartości, po prostu wyświetlił puste, tzn np:

id | imie | nazwisko | level
1 Imie Nazwisko 1
2 Imie Nazwisko 4
3 Imie Nazwisko [null]
4 Imie Nazwisko 4
5 Imie Nazwisko 3
6 Imie Nazwisko [null]
7 Imie Nazwisko 5
...
Turson
LEFT JOIN
M@X
hmmm samo dopisanie LEFT JOIN nic nie zmieniło... może coś jeszcze poza tym powinienem dodać ?
nospor
zamiast JOIN z pierwszego posta mialo byc LEFT JOIN. Ta prosta zmiana robi co chcesz. Jesli ci nie robi, znaczy ze źle zmodyfikowales pierwszego posta

ps:
gr.id = odz.id; ? w tabeli odznaczenia pole ID wskazuje na ID grupy?
M@X
cholender nie wszystko napisałem w zapytaniu smile.gif faktycznie to co piszecie sie zgadza (pomógł+)

w takim razie dopisze dalej o co mi chodzi, mam nadzieje że nie namieszam smile.gif

Chciałbym w tym zapytaniu dodac jeszcze WHERE

mianowicie:

  1. SELECT gr.id, gr.imie, gr.nazwisko, odz.level
  2. FROM gracze gr
  3. JOIN odznaczenia odz ON gr.id = odz.id
  4. WHERE odz.level = '1';


ale tak aby wyświetlił mi wszystkie rekordy gdzie level = 1 lub nie jest puste.. tzn:

id | imie | nazwisko | level
1 Imie Nazwisko 1
3 Imie Nazwisko [null]
5 Imie Nazwisko 1
6 Imie Nazwisko [null]
7 Imie Nazwisko [null]
9 Imie Nazwisko 1
...

Gdzie tabela "odznaczenia" w ogóle nie ma redordów id = 3, 6, 7
nospor
WHERE odz.id is null or odz.level = '1';
no i LEFT JOIN rzecz jasna
M@X
hmmm jakoś nie jestem pewny tego ....
czy "is null" nie powinien wyciągać tych rekordów dla których wartośc level = 'null' ?

mi chodzi tak naprawde o wyciągnięcie tych rekordów z tabeli "odznaczenia" które nie istnieją...

tzn jeśli w tabeli "gracze" istnieje jakiś rekord o id = 10 a w tabeli "odznaczenia" go nie ma to wtedy żeby zapytanie właśnie wyświetliło go że ma level puste
nospor
Cytat
tzn jeśli w tabeli "gracze" istnieje jakiś rekord o id = 10 a w tabeli "odznaczenia" go nie ma to wtedy żeby zapytanie właśnie wyświetliło go że ma level puste
Kurcze.... No i to wlasnie ci podalem....

Chcesz albo wyciagnac oznaczenia, ktore mają level=1 albo te, ktore nie istnieją. No i tak masz.
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.