Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: łączenie dwóch tabel, gdy coś istnieje
Forum PHP.pl > Forum > Bazy danych > MySQL
slepiec
mam takie coś :
  1. SELECT k_bb.IDU,IDG,k_bb.IDB,TIME_TO_SEC(TIMEDIFF(now(),EndTime)) AS tim,lvl
  2. FROM k_bb,k_cb WHERE TIME_TO_SEC(TIMEDIFF(now(),EndTime)) > 0 AND k_bb.IDC=1 AND k_bb.IDB = k_cb.IDB;


wszystko niby działa, ale chciałbym by gdy w tabeli k_cb nie ma wpisu o taki IDB, do lvl wpisało -1.
Aktualnie gdy nie ma takiego wpisu w k_cb wyniku nie ma wcale - co chyba zrozumiałe.

-----edycja :

uporałem się, zostawiam to dla innych :
  1. SELECT k_bb.IDU,IDG,k_bb.IDB,TIME_TO_SEC(TIMEDIFF(now(),EndTime)) AS tim,
  2. IF(NOT EXISTS (SELECT lvl FROM k_cb WHERE k_cb.IDB=k_bb.IDB),-1,k_cb.lvl ) AS lvl
  3. FROM k_bb,k_cb WHERE TIME_TO_SEC(TIMEDIFF(now(),EndTime)) > 0 AND k_bb.IDC=1 AND (k_bb.IDB = k_cb.IDB OR NOT EXISTS (SELECT lvl FROM k_cb WHERE k_cb.IDB=k_bb.IDB))
  4. ;

taka radosna twórczość, jak by ktoś wiedział jak to ładniej zapisać to chętnie skorzystał.
Cezar708
jeżeli nie jest bardzo konieczne te -1 to możesz użyć OUTER JOIN, po prostu jeśli nie istnieje to w miejsce gdzie Ty chcesz -1 wstawi Ci NULL a potem w PHP juz myślę że dasz sobie z tym radę

pseudoSQL:

  1. SELECT *
  2. FROM k_bb LEFT OUTER JOIN k_cb WHERE k_bb.IDB = k_cb.IDB


(ps nie studiowałem Twojego zapytania więc oczywiście warunki pobrania i połączenia tabel sam musisz ustawić)
slepiec
dzięki wielkie, moje też działało, ale to jest pewnie wydajniejsze.
Jeden błąd mi wyskoczył, ale szybko poprawiłem, powinno być :
  1. SELECT *
  2. FROM k_bb LEFT OUTER JOIN k_cb [b]ON[/b] k_bb.IDB = k_cb.IDB
Cezar708
a fakt... pisałem z palca i nie sprawdzałem tego
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.