Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SQL] Zagwozdka
throw.pl
post
Post #1





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 23.09.2009

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


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


--------------------
The great thing about Object Oriented code is that it can make small, simple problems look like large, complex ones.
Go to the top of the page
+Quote Post
phpion
post
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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. ;


Ten post edytował phpion 9.11.2010, 17:54:26
Go to the top of the page
+Quote Post
Crozin
post
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


  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


Ten post edytował Crozin 9.11.2010, 17:55:48
Go to the top of the page
+Quote Post
throw.pl
post
Post #4





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 23.09.2009

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


Wielkie dzięki, za pomoc smile.gif Trochę przerobiłem kod, bo w sumie struktura mojej bazy jest 5x bardziej skomplikowana;) i działa.


--------------------
The great thing about Object Oriented code is that it can make small, simple problems look like large, complex ones.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 21.08.2025 - 01:13