Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [sql] dane historyczne, self join..
Forum PHP.pl > Forum > Bazy danych
FiDO
Witam,

Mam tabele:
[id] [osoba] [punkty] [data]

Sa do niej codziennie dokladane nowe rekordy nazwa-punkty-data.
Przykladowe dane moga wygladac tak:
osoba1 - ilosc1 - data1
osoba2 - ilosc2 - data1
osoba1 - ilosc3 - data2
osoba2 - ilosc4 - data2
osoba1 - ilosc5 - data3
osoba2 - ilosc6 - data3
osoba3 - ilosc7 - data3

data3 > data2 > data1

Jak widac w nowszych wpisach moga dojsc nowe osoby do zestawienia.

Problem polega na tym, zeby wyciagnac porownanie z dwoch dowolnych dat (ktore znam), przy zalozeniu ze maja zostac wyciagniete wszystkie osoby, ktore sa w dacie nowszej (Ci ktorych nie bylo w tej starszej moga miec reszte pol NULL... niewazne.. byleby ich zwrocilo)

Umiem wyciagnac jednym zapytaniem te ktore sa i w jednej i w drugiej dacie, np:
[sql:1:2de8a97fdd]SELECT t1.osoba, t1.punkty ile1, t2.punkty ile2, (t2.punkty - t1.punkty) bilans
FROM tabela t1
RIGHT JOIN tabela t2 ON (t1.osoba = t2.osoba)
WHERE t1.data = '2004-02-03' AND t2.data = '2004-02-05';
[/sql:1:2de8a97fdd]
Niestety zeby wyciagnac w tym samym zapytaniu tez tych, ktorych we wczesniejszej dacie nie ma juz nie potrafie zrobic :/
Narazie posilkuje sie drugim zapytaniem, ktore wyciaga tych pozostalych.

Moze byc zapytanie z uzyciem subqueries (to projekt "dla siebie" wiec moge sobie uzyc czego chce, a np. postgresa mam), choc bardziej pasowaloby mi samymi joinami o ile sie da.
kszychu
MOże zamiast: WHERE t1.data = '2004-02-03' AND t2.data = '2004-02-05'
użyj: WHERE t1.data = '2004-02-03' OR t2.data = '2004-02-05'
uboottd
Taki szkic:

[sql:1:ac184f0be0]
select t1.osoba, t1.pkt, t1.pkt-ifnull(t2.pkt,0) as bilans
from tabela as t1
left join tabela as t2 on t1.osoba = t2.osoba and t2.data = '2002-01-02'
where t1.data = '2002-01-03';
[/sql:1:ac184f0be0]
FiDO
Dzieki wielkie uboottd, mam tylko jedno pytanie.
Dlaczego to zapytanie dziala? biggrin.gif
Tzn. chodzi mi konkretnie o to, ze jak wybiore sobie w nim obie daty, to widze ze data druga u osob, ktore dopiero sie pojawily jest NULL, a w warunku zlaczenia tabel jest napisane AND t2.data = 'jakas_data', czyli tego warunku nie spelnia.
uboottd
wlasnie dlatego ze nie spelnia tego warunku jest null winksmiley.jpg
A dokladnie to dzialanie jest takie:
tab1 LEFT JOIN tab2 ON warunek
wybierz _wszystkie_ wiersze z tabeli tab1, nastepnie dla kazdego wiersza z tab1 dopasuj wszystkie wiersze z tab2 spelniajace podany warunek.
Natomiast jak w tabeli tab2 nie ma wiersza ktory by dla danego wiersza z tab1 spelnil podany warunek to do wiersza z tab1 doklejany jest wiersz skaldajacy sie z samych nulli.
Namieszalem ? smile.gif
FiDO
No tak... normalnie bym skojarzyl, ale przy self-joinach cos nie moglem winksmiley.jpg
Dzieki raz jeszcze.
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.