Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PDO::Brak ID przy left join
Forum PHP.pl > Forum > Bazy danych
NickOver
Cześć!
Kod:
  1. $query = $this->db->prepare(
  2. "SELECT * FROM employees AS e
  3. LEFT JOIN cards AS c ON e.employee_id = c.employee_id
  4. LEFT JOIN enters AS en ON en.card_id = c.card_id
  5. WHERE (c.number = :variable1 OR e.firstname = :variable2 OR e.lastname = :variable3 OR c.card_id = :variable4)"
  6. );

Niestety nie zwraca on ID użytkownika, całą reszte już tak. ID na pewno jest. Przy samym select'cie bez left join'a wszystko jest ok.
Wiecie o co chodzi?
Pyton_000
dodaj
  1. e.id AS employee_id_2
przed *
mmmmmmm
Problemem jest tu... *.
Przy * zwracane są wszystkie kolumny ze wszystkich tabel. W MySQL w kolejności występowania we FROM. Czyli dla ciebie będzie to:
e.id, e..., ... c.id, c...., ... en.id, en...
A PDO nazywa te kolumny tak jak ma. Czyli nazywa je: id (z e), employee_id (z c), id (z c) - upss, nie mogę, bo już mam id. A potem wstawia pobrane wartości do odpowiednich kolumn. W kolejności występowania. Więc do id w efekcie wyląduje ci id z OSTATNIEJ tabeli. A jeśli jest ona dowiązana LEFT JOINem, to może się zdarzyć, że jest NULL, więc nie ma wartości.

A widzę, że nie skorzystałeś z rady i wolałeś użyć 4 zmiennej zamiast prostego IN ... Mam na myśli "(c.number = :variable1 OR e.firstname = :variable2 OR e.lastname = :variable3 OR c.card_id = :variable4)"
NickOver
Cytat(mmmmmmm @ 2.03.2015, 13:41:09 ) *
Problemem jest tu... *.
Przy * zwracane są wszystkie kolumny ze wszystkich tabel. W MySQL w kolejności występowania we FROM. Czyli dla ciebie będzie to:
e.id, e..., ... c.id, c...., ... en.id, en...
A PDO nazywa te kolumny tak jak ma. Czyli nazywa je: id (z e), employee_id (z c), id (z c) - upss, nie mogę, bo już mam id. A potem wstawia pobrane wartości do odpowiednich kolumn. W kolejności występowania. Więc do id w efekcie wyląduje ci id z OSTATNIEJ tabeli. A jeśli jest ona dowiązana LEFT JOINem, to może się zdarzyć, że jest NULL, więc nie ma wartości.

A widzę, że nie skorzystałeś z rady i wolałeś użyć 4 zmiennej zamiast prostego IN ... Mam na myśli "(c.number = :variable1 OR e.firstname = :variable2 OR e.lastname = :variable3 OR c.card_id = :variable4)"



Nie zmieniłem bo dopiero dziś zerknąłem na ten temat.

Co do tego co napisąłeś apropo zapytania. Jak może nadpisywać wartością z innej tabelki skoro nie ma pasujących pól a co za tym idzie nie ma czym napisać bo tabelka którą chce dołaczyć nie ma odpowiednich pól (w sensie żadne nie zgadza się z polem które jest podane w łączeniu)?
nospor
ON e.employee_id = c.employee_id
Jesli twoje ID kryje sie polem employee_id to wlasnie masz to pole w dwoch roznych tabelach i ostatnia tabela nadpisuje wynik pierwszej.
NickOver
No tak, to rozumiem. Ale czemu tak się dzieje skoro warunek złączenia jest nieprawidłowy?
nospor
Ale jest.. bazy nie interesuje czy jest prawidlowy czy nie. Jak nie jest prawidlowy, to wowczas pod kolumną bedziesz mial NULL. ALe bedziesz mial. I ta wlasnie kolumna nadpisze wczesniejszą kolumne
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.