Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobranie danych z dwóch identycznych tabel na podstawie danych z trzeciej tabeli
Forum PHP.pl > Forum > Bazy danych
miedzna
Mam 3 tabeli

tabela_1a (W ORYGINALE NAZYWA SIĘ tp):
id | pid | name
---------------
1 | 0 | nazwa


tabela_1b (W ORYGINALE NAZYWA SIĘ ptk):
id | pid | name
---------------
1 | 0 | nazwa

(muszą być 2 tabeli o identycznej strukturze, bo jedna tabela zawiera dane jednej firmy, a druga drugiej firmy, o półączeniu tych tabel nie ma mowy, bo w takiej formie je zastałem)



tabela 2:
id | id_od* | skad | dokad | id_do
----------------------------------------------
1 | 1 | tabela_1a| info** | info**

* klucz obcy tabeli tabela_1a lub tabela_1b
** - pobieram z $_GET["zmienna"]


Tabela 2 zawiera dane:
id - wiadomo
id_od - wskazuje na id elementu z tabeli tabela_1a LUB tabela_1b
skad - wskazuje na tabelę tabela_1a LUB tabela_1b
dokad - to takie tam mało ważne info
id_do - na podstawie tego chcę oprzeć całe zapytanie, zmienną tą pobieram z $_GET["zmienna"]


Tabela 2 gromadzi tzw raportowania, wiele jednostek z tp może raportować do wielu jednostek z ptk i na odwrót, więc wskazuje najpierw ID jednostki raportującej, później jest nazwa firmy (tp lub ptk) skąd idzie raport, później jest wskazanie firmy do której idzie raport (tp lub ptk) a później wskazanie ID jednostki do której idzie raport.

i teraz co chcę zrobić:

chcę pobrać id i name z tabeli albo tabela_1a, albo z tabela_1b w zależności od tego co jest w polu skad tabeli tabela 2
może być taka sytuacja, że dane id i name są pobierane z obu pierwszych tabel, a może być, że tylko z jednej z nich. Jak takie zapytanie wykonać?


Próbowałem tak:

SELECT t.name, upper(r.skad) AS skadDuze, r.skad AS skadMale
FROM (SELECT skad FROM raporty WHERE id_do = 62) AS tabela t, raporty r
WHERE r.dokad = 'tp'
AND r.id_do = 62
AND r.id = t.id
AND UNIX_TIMESTAMP( t.start ) <= UNIX_TIMESTAMP( DATE( NOW( ) ) )
AND UNIX_TIMESTAMP( t.stop ) >= UNIX_TIMESTAMP( DATE( NOW( ) ) )

czyli wykorzystując podzapytanie, które mi sprawdza wartosc pola skad i na podstawie tego generuje nazwe tabeli do dalszych zapytan, ale to nie działa sad.gif
ddiceman
Sprobuj (pisane z palca, musisz sprawdzic)
  1. SELECT
  2. IFNULL(t1.name, t2.name) AS name,
  3. UPPER(raporty.skad) AS skadDuze,
  4. raporty.skad AS skadMale
  5. FROM raporty LEFT JOIN tabela_1a ON (raporty.skad = 'tabela_1a' AND raporty.id = tabela_1a.id) LEFT JOIN tabela_2a ON (raporty.skad = 'tabela_2a' AND raporty.id = tabela_2a.id)
  6. WHERE raporty.dokad = 'tp' AND raporty.id_do = 62 AND UNIX_TIMESTAMP(start) <= UNIX_TIMESTAMP(DATE(NOW())) AND UNIX_TIMESTAMP(stop) >= UNIX_TIMESTAMP(DATE(NOW()));
miedzna
Dzięki za pomoc, ale nie bardzo to działa, bo aliasy pogubiłeś smile.gif

Kombinowałem i wyszło mi niestety 2 zapytania, jedno sprawdza warunek dla tabeli 1, a drugie dla tabeli 2, czy ktoś ma pomysł, żeby to połączyć?

  1. SELECT t.id, t.name
  2. FROM tp AS t
  3. INNER JOIN raporty AS r ON ( t.id = r.id_od ) AND r.id_do =62 AND r.skad = 'tp' AND UNIX_TIMESTAMP( t.start ) <= UNIX_TIMESTAMP( DATE( NOW( ) ) ) AND UNIX_TIMESTAMP( t.stop ) >= UNIX_TIMESTAMP( DATE( NOW( ) ) )
  4.  
  5.  
  6. SELECT p.id, p.name
  7. FROM ptk AS p
  8. INNER JOIN raporty AS r ON ( p.id = r.id_od ) AND r.id_do =62 AND r.skad = 'ptk' AND UNIX_TIMESTAMP( p.start ) <= UNIX_TIMESTAMP( DATE( NOW( ) ) ) AND UNIX_TIMESTAMP( p.stop ) >= UNIX_TIMESTAMP( DATE( NOW( ) ) )



A to zapytanie niby poprawne, ale wyciąga dane tylko z tabeli tp
  1. SELECT IFNULL( t1.name, t2.name ) AS name, raporty.id_od AS id_od
  2. FROM raporty LEFT JOIN tp AS t1 ON ( raporty.skad = 'tp' AND raporty.id_od = t1.id )
  3. LEFT JOIN ptk AS t2 ON ( raporty.skad = 'ptk' AND raporty.id_od = t2.id )
  4. WHERE raporty.id_do =62 AND UNIX_TIMESTAMP( t1.start ) <= UNIX_TIMESTAMP( DATE( NOW( ) ) ) AND UNIX_TIMESTAMP( t1.stop ) >= UNIX_TIMESTAMP( DATE( NOW( ) ) ) ;


już szlak mnie trafia...

ten kod już prawie działa:
  1. SELECT r.id_od AS id, IFNULL( t1.name, t2.name ) AS name, UPPER( r.skad ) AS skadDuze, r.skad AS skadMale
  2. FROM raporty AS r
  3. LEFT JOIN tp AS t1 ON ( r.skad = 'tp' AND r.id_od = t1.id )
  4. LEFT JOIN ptk AS t2 ON ( r.skad = 'ptk' AND r.id_od = t2.id )
  5. WHERE r.id_do =62


ale dodam jeszcze warunek operujący na datach:

  1. AND UNIX_TIMESTAMP( t1.start ) <= UNIX_TIMESTAMP( DATE( NOW( ) ) ) AND UNIX_TIMESTAMP( t1.stop ) >= UNIX_TIMESTAMP( DATE( NOW( ) ) ) AND UNIX_TIMESTAMP( t2.start ) <= UNIX_TIMESTAMP( DATE( NOW( ) ) ) AND UNIX_TIMESTAMP( t2.stop ) >= UNIX_TIMESTAMP( DATE( NOW( ) ) )


to już wyświetla mi 0 wyników.
ddiceman
To wlasnie przez aliasy Ci nie dziala bo na koniec stawiasz warunek z t1. Sprobuj moze:
  1. SELECT IFNULL( t1.name, t2.name ) AS name, raporty.id_od AS id_od
  2. FROM raporty LEFT JOIN tp AS t1 ON ( raporty.skad = 'tp' AND raporty.id_od = t1.id )
  3. LEFT JOIN ptk AS t2 ON ( raporty.skad = 'ptk' AND raporty.id_od = t2.id )
  4. WHERE raporty.id_do =62 AND (
  5. (t1.name IS NOT NULL AND UNIX_TIMESTAMP( t1.start ) <= UNIX_TIMESTAMP( DATE( NOW( ) ) ) AND UNIX_TIMESTAMP( t1.stop ) >= UNIX_TIMESTAMP( DATE( NOW( ) ) )
  6. ) OR (t2.name IS NOT NULL AND UNIX_TIMESTAMP( t2.start ) <= UNIX_TIMESTAMP( DATE( NOW( ) ) ) AND UNIX_TIMESTAMP( t2.stop ) >= UNIX_TIMESTAMP( DATE( NOW( ) ) )
  7. )
  8. );
miedzna
W koncu zadziałało smile.gif

Dziękuję bardzo!
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.