Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Złożone zapytanie z dwóch tabel?
Forum PHP.pl > Forum > Przedszkole
graft
Sorry, że tak z partyzanta po wielu miesiącach nieobecności na forum, ale mózg już się stopił i nie idzie ruszyć dalej.

Mam 2 tabele:


Tabela a:
---------------------------------------
id_a | nazwa_a | populacja
---------------------------------------
3 | kot | 0
4 | pies | 2
5 | lis | 10
6 | wilk | 0
7 | dzik | 3
---------------------------------------


Tabela b:
-----------------------------------------
id_b | data_b | historia
-----------------------------------------
4 | 20.02.2014 | 2
5 | 25.03.2014 | 8
5 | 10.05.2014 | 8
3 | 10.06.2014 | 0
5 | 10.07.2014 | 9
5 | 15.09.2014 | 10
-----------------------------------------



Potrzebuję wyciągnąć pogrupowaną listę istniejącej (populacja>0) populacji zwierząt, którym odnotowano wzrost populacji do dnia np. 01.09.2014 ale pomijając rekordy (nazwy zwierząt), którym zaktualizowano informacje (data_b) po terminie 01.09.2014.
oraz wszystkie zwierzęta pozostałe o dodatniej populacji, nie posiadające historii zmian w tabeli b.

Czyli z powyższych tabel interesuje mnie, aby pobrać:

1) pies | id 4 | populacja 2
2) dzik | id 7 | populacja 3

** kota nie pobiera ponieważ jest 0 kotów
*** lisa nie pobiera, ponieważ ostatnia aktualizacja miała miejsce po 01.09.2014



Próbowałem coś takiego:

SELECT * FROM tabela_a LEFT JOIN tabela_b

ON (tabela_a.id_a = tabela_b.id_b)

WHERE populacja>0

AND data_b < $data_01_09_2014



Oczywiście nie zadziała, ponieważ pominie rekord z 15.09.2014 i wyświetli kota z datą 10.07.2014, a ja chciałbym zastosować warunek wyszukiwania z tabeli a, tylko w przypadku, gdy w babeli b nie ma wpisu do danego id z określoną datą.


Jakieś wskazówki...?
mmmmmmm
http://sqlfiddle.com/#!2/03186/4
Daimos
Więc tak (na kolanie pisane, dasz strukturę to sprawdzę i napiszę konkretnie, bo nie chce mi się tworzyć tabeli smile.gif )
  1. SELECT * FROM tabela_a
  2. LEFT JOIN tabela_b ON (tabela_a.id_a = tabela_b.id_b)
  3. WHERE populacja>0
  4. AND (data_b < $data_01_09_2014 OR data_b = NULL)

Nie wiem czy dobrze zrozumiałem, ale chyba o to Ci chodziło? Jeśli nie ma rekordu i robimy join left, to wartość jest NULL, dlatego też dodałem OR data_b = null.
Jeśli Cię interesuje grupowanie to GROUP By, a do tego order by date i masz załatwione świeże daty.
graft
mmmmmmm, dokładnie o to mi chodziło guitar.gif
Do tej powy nie używałem max'ów, czy coalesce, a tu proszę jakie fajne rozwiązanie!
Cytat
select a.* from tabela_a a left join (select id_b, max(data_b) data_b, max(historia) from tabela_b group by 1) sub on sub.id_b=a.id_a
where populacja>0 and coalesce(data_b, '2014-08-31')<'2014-09-01'


Daimos, Twoje rozwiązanie zwróciłoby lisa, a to właśnie chciałem wykluczyć.
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.