Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Złożone zapytanie z dwóch tabel?, CASE, Join.....?
graft
post
Post #1





Grupa: Zarejestrowani
Postów: 110
Pomógł: 0
Dołączył: 24.03.2007

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


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

Ten post edytował graft 16.09.2014, 18:34:12
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #2





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


http://sqlfiddle.com/#!2/03186/4
Go to the top of the page
+Quote Post
Daimos
post
Post #3





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

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


Więc tak (na kolanie pisane, dasz strukturę to sprawdzę i napiszę konkretnie, bo nie chce mi się tworzyć tabeli (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post
graft
post
Post #4





Grupa: Zarejestrowani
Postów: 110
Pomógł: 0
Dołączył: 24.03.2007

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


mmmmmmm, dokładnie o to mi chodziło (IMG:style_emoticons/default/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ć.

Ten post edytował graft 17.09.2014, 12:12:24
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 24.08.2025 - 08:37