![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 717 Pomógł: 0 Dołączył: 12.06.2002 Skąd: Wolsztyn..... Studia: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
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. -------------------- Brak czasu :/
|
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 712 Pomógł: 23 Dołączył: 27.10.2003 Skąd: z kontowni Ostrzeżenie: (0%) ![]() ![]() |
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' -------------------- "Coś się kończy, coś się zaczyna." Andrzej Sapkowski
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 384 Pomógł: 0 Dołączył: 3.04.2003 Skąd: Chorzow Ostrzeżenie: (0%) ![]() ![]() |
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] |
|
|
![]()
Post
#4
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 717 Pomógł: 0 Dołączył: 12.06.2002 Skąd: Wolsztyn..... Studia: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
Dzieki wielkie uboottd, mam tylko jedno pytanie.
Dlaczego to zapytanie dziala? ![]() 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. -------------------- Brak czasu :/
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 384 Pomógł: 0 Dołączył: 3.04.2003 Skąd: Chorzow Ostrzeżenie: (0%) ![]() ![]() |
wlasnie dlatego ze nie spelnia tego warunku jest null
![]() 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 ? ![]() |
|
|
![]()
Post
#6
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 717 Pomógł: 0 Dołączył: 12.06.2002 Skąd: Wolsztyn..... Studia: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
No tak... normalnie bym skojarzyl, ale przy self-joinach cos nie moglem
![]() Dzieki raz jeszcze. -------------------- Brak czasu :/
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 23:22 |