Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> PDO::Brak ID przy left join
NickOver
post
Post #1





Grupa: Zarejestrowani
Postów: 332
Pomógł: 10
Dołączył: 13.03.2014
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


dodaj
  1. e.id AS employee_id_2
przed *

Ten post edytował Pyton_000 2.03.2015, 14:25:26
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #3





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


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)"
Go to the top of the page
+Quote Post
NickOver
post
Post #4





Grupa: Zarejestrowani
Postów: 332
Pomógł: 10
Dołączył: 13.03.2014
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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)?

Ten post edytował NickOver 2.03.2015, 14:16:30
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




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.
Go to the top of the page
+Quote Post
NickOver
post
Post #6





Grupa: Zarejestrowani
Postów: 332
Pomógł: 10
Dołączył: 13.03.2014
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


No tak, to rozumiem. Ale czemu tak się dzieje skoro warunek złączenia jest nieprawidłowy?
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.12.2025 - 13:49