Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL] Zagwozdka
Forum PHP.pl > Forum > Bazy danych
throw.pl
Mam taki problem, być może jestem chwilowo zamroczony, ale nie mogę tego rozwiązać.

Mam dwie tabelki opisujące różne obiekty. Mam trzecią tabelkę opisującą czy zachodzi relacja pomiędzy obiektami.

tab1 { id, attr1, attr2 }
tab2 { id, attr3, attr4, attr5 }
tab3 { id, tab1id, tab2id }

Wyobraźmy sobie, że tab1 to lista organizacji.
Wyobraźmy sobie, że tab2 to lista ludzi.

Chciałbym dla danego człowieka (tab2.id) wyświetlić listę wszystkich organizacji, ale z informacją czy człowiek jest w organizacji czy nie. Jeżeli nie jest w organizacji, chciałbym aby zwróciło -1,0, NULL, a jeżeli jest to, żeby zwróciło np. TRUE.

Jednym słowem, wynik powinien być listą list {tab1.id, tab1.attr1, tab1.attr2, TRUE lub FALSE}. W ten sposób będę mógł wyświetlić dla każdego człowieka organizacje z informacją czy w nich jest czy nie.

Problem, że przy pustej tab2 (żaden człowiek nie jest w żadnej organizacji) zapytania z JOIN mi nie działają. Dla pustej tabeli tab2, powinno zwrócić całą tab1 z dodatkowym polem TRUE przy każdym wierszu.

Ktoś ma pomysł?smile.gif
phpion
Cytat(throw.pl @ 9.11.2010, 17:41:53 ) *
Problem, że przy pustej tab2 (żaden człowiek nie jest w żadnej organizacji) zapytania z JOIN mi nie działają.

Zależy z jakiego JOINa korzystasz - powinieneś korzystać z LEFT JOIN.

Jeśli się nigdzie nie machnąłem (dostałem oczopląsu przy nazwach tabel i kolumn winksmiley.jpg ) to powinno zadziałać:
  1. SELECT
  2. tab1.*,
  3. IF (tab3.tab1id IS NULL, 'nie jest', 'jest') AS czy_jest
  4. FROM
  5. tab2
  6. LEFT JOIN tab3 ON (tab3.tab2id = tab2.id) -- tu musi byc LEFT JOIN
  7. JOIN tab1 ON (tab1.id = tab3.tab1id)
  8. WHERE
  9. tab2.id = 123 -- identyfikator czlowieka
  10. ;

W sumie nie ma co korzystać z tabeli ludzi, więc to powinno wystarczyć:
  1. SELECT
  2. tab1.*,
  3. IF (tab3.tab1id IS NULL, 'nie jest', 'jest') AS czy_jest
  4. FROM
  5. tab1
  6. LEFT JOIN tab3 ON (tab3.tab1id = tab1.id) -- tu musi byc LEFT JOIN
  7. WHERE
  8. tab3.tab1id = 123 -- identyfikator czlowieka
  9. OR tab3.tab1id IS NULL -- lub go nie ma
  10. ;
Crozin
  1. SELECT czlowiek.imie, organizacja.nazwa, tab3.czlowiek_id IS NULL AS jest_czlonkiem
  2. FROM organizacja
  3. LEFT JOIN tab3 ON organizacja.id = tab3.organizacja_id
  4. LEFT JOIN czlowiek ON czlowiek.id = tab3.czlowiek_id
throw.pl
Wielkie dzięki, za pomoc smile.gif Trochę przerobiłem kod, bo w sumie struktura mojej bazy jest 5x bardziej skomplikowana;) i działa.
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.