![]() |
![]() ![]() |
![]() |
![]()
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 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
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) )
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. |
|
|
![]()
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 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.08.2025 - 08:37 |