Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Jak z dwóch tabel wyłuskać dane z najmłodszą datą...
Forum PHP.pl > Forum > Przedszkole
Andrzej1002
Mam taki problem:

Dwie tabele w bazie danych...

tabela pierwsza "ta":

Ld--NrKlienta--Mieiac--Rok---Wartosc--
-9----22--------5-----2009----18------
-8----15--------5-----2009----15------
-7----21--------5-----2009----11------
-6----22--------5-----2009-----9------
-5----44--------5-----2009-----9------
-4----44--------5-----2009----57------
-3----22--------5-----2009----19------


tabela druga "tb":

-Ld--NrKlienta--Data----------email--
-33-----15-----2009-05-22---aaa9999@o2.pl
-33-----22-----2009-05-18---aaa8888@o2.pl
-33-----21-----2009-05-17---aaa7777@o2.pl
-33-----22-----2009-05-11---aaa6666@o2.pl
-33-----44-----2009-05-05---aaa5555@o2.pl
-33-----22-----2009-05-01---aaa4444@o2.pl
-33-----15-----2009-04-27---aaa3333@o2.pl
-33-----22-----2009-04-22---aaa2222@o2.pl
-33-----22-----2009-04-15---aaa1111@o2.pl

Chciałbym otrzymać TYLKO jeden, NAJŚWIEŻSZY email dla danego klienta czyli wynik z powyższych tabel powinien wyglądać tak

Rezultat:

Klient email
15 -- aaa9999@o2.pl
22 -- aaa8888@o2.pl
21 -- aaa7777@o2.pl
44 -- aaa5555@o2.pl


Próbowałem różnych zapytań ale zawsze dostaję za dużo odpowiedzi czyli albo namnożą mi się Klienci albo wyciąga więcej emaili. Klienci często zmieniają swe eMaile a ważny jest tylko jeden - ten z najświeższą datą...


  1. $wynik = mysql_query ("SELECT DISTINCT ta.NrKlienta, ta.Miesiac, ta.Rok, tb.NrKlienta, tb.email tb.data FROM ta tb WHERE ta.NrKlienta = tb.NrKlienta AND ta.Miesiac = '$month' AND tbRok ='$year' AND tb.email questionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gif;")


Jeżeli ktoś podpowie mi prosty SELECT to będzie super...
Pawel_W
  1. SELECT `email` FROM tb ORDER BY `data` GROUP BY `NrKlienta`

nie wiem czy na 100% działa, pisane "z palca" winksmiley.jpg
Andrzej1002
może trochę źle zadałem pytanie ale chodzi mi zawężenie klientów tylko do tych których wyciągnąłem z tabeli pierwszej a nie może być wszystkich z tabeli drugiej. czyli tak jakby:

tabela druga "tb":

-Ld--NrKlienta--Data----------email--
-33-----15-----2009-05-22---aaa9999@o2.pl
-32-----22-----2009-05-18---aaa8888@o2.pl
-31-----21-----2009-05-17---aaa7777@o2.pl
-30-----22-----2009-05-11---aaa6666@o2.pl
-29-----44-----2009-05-05---aaa5555@o2.pl
-28-----22-----2009-05-01---aaa4444@o2.pl
-27-----15-----2009-04-27---aaa3333@o2.pl
-26-----22-----2009-04-22---aaa2222@o2.pl
-25-----22-----2009-04-15---aaa1111@o2.pl
-24-----84-----2009-04-15---zzz5555@o2.pl
-23-----92-----2009-04-11---zzz3333@o2.pl
-24-----77-----2009-04-05---zzz4444@o2.pl


a rezultat:

Klient email
15 -- aaa9999@o2.pl
22 -- aaa8888@o2.pl
21 -- aaa7777@o2.pl
44 -- aaa5555@o2.pl

czyli wyeliminowano klientów nr 77, 92 i 84 a klienci nr 15, 21, 22 i 44 mają najświeższe adresy... Czyli jest konieczność dwóch tabel.

Ale dzięki za chęci. Może wpadniesz na pomycl jak wymieszać te dane i wysublimować tylko te j.w.

Pawel_W
no to co za problem? dostawiasz LEFT JOIN i gotowe smile.gif nie podam ci gotowca bo przecież nie o to chodzi smile.gif
Andrzej1002
Niestety nie powiodło mi się. Mój cały problem polega na tym że mam kilka adresów emailowych dla jednego klienta (np. 22 ma ich 5 a interesule mnie tylko: adres aaa8888@o2.pl z dnia 2009-05-18. Ponadto jednym zapytaniem mam otrzymać wynik dla klientów: 15, 21, 22 i 44. Mam problem z NAJNOWSZĄ datą dla danego emaila questionmark.gifquestionmark.gif?
Nie znam wielu poleceń MySQL i nie będa mi nigdy (mam nadzieję) potrzebne. Buduje na swe potrzeby pewien dość prosty projekt i wlaściwie już go kończę ale czasami się zatrzymuję. Polecenia LEFT JOIN coś nie potrafię zaprząść do TAKIEGO wyszukania...

Czy NIKT mi nie podpowie jak TO wykonać. Ja nie jestem super w PHP MySQLu ale Wy to znacie... Dla mnie to problem ale WY... przecież zapewne wiecie jak to zrobić.... (chyba, że nie.. - ale to mało prawdopodobne). Uważam, że temat jest trudny..........
Pilsener
Nie bardzo rozumiem opis problemu... Chcesz dla jakiegoś ID z tabeli A przypisać rekord z tabeli B, ale tylko taki, który spełni określone warunki? Pewnie można na wiele sposobów, ale ja proponuję podzapytanie:
  1. SELECT * FROM users
  2. JOIN (SELECT * FROM articles ORDER BY DATA DESC) articles USING(login)
  3. GROUP BY login


Zasada jest prosta:
- pobierane są tylko te artykuły, które istnieją
- jeśli jest więcej niż jeden artykuł dla danego użytkownika, pobierany jest najnowszy

Zamiast tabeli "użytkownicy" i "artykuły" podstaw swoje i tyle.

Andrzej1002
Nie mogę sobie z tym poradzić. Niestety chyba zbyt komplikuję zapytanie z JOIN bo ciągle mam błędy... lub zbyt dużo wyników.

Dokończyłem zapytanie to od którego zacząłem czyli:

  1. $wynik = mysql_query ("SELECT DISTINCT ta.NrKlienta, ta.Miesiac, ta.Rok, tb.NrKlienta, tb.email, tb.data FROM ta tb WHERE ta.NrKlienta = tb.NrKlienta AND ta.Miesiac = '$month' AND tb.Rok ='$year' GROUP BY (tb.email) or
  2. die ("błąd w pytaniu");


i działa idealnie ALE wybiera mi najstarsze eMaile zamiast najmlodszych...

15 -- aaa9999@o2.pl
22 -- aaa1111@o2.pl <----- a powinno być aaa8888@o2.pl
21 -- aaa7777@o2.pl
44 -- aaa5555@o2.pl

pozostałe eMaile byly wpisane tylko raz więc będą zawsze wybrane dobrze.


Chyba faktycznie nie jest to bardzo trudne ale tak się zablokowalem w tym zestawieniu że nie potrafię obiektywnie na to popatrzeć...

Proszę o pomoc.

trochę źle zacytowałem moje szukanie. "Prawie poprawnie" jest [źle zacytowalem: GROUP BY (tb.NrKlienta)]:

  1. $wynik = mysql_query ("SELECT DISTINCT ta.NrKlienta, ta.Miesiac, ta.Rok, tb.NrKlienta, tb.email, tb.data FROM ta tb WHERE ta.NrKlienta = tb.NrKlienta AND ta.Miesiac = '$month' AND tb.Rok ='$year' GROUP BY (tb.NrKlienta) ; ") or
  2. die ("błąd w pytaniu");


i działa idealnie ALE wybiera mi najstarsze eMaile zamiast najmlodszych...

15 -- aaa9999@o2.pl
22 -- aaa1111@o2.pl <----- a powinno być aaa8888@o2.pl
21 -- aaa7777@o2.pl
44 -- aaa5555@o2.pl

pozostałe eMaile byly wpisane tylko raz więc będą zawsze wybrane dobrze.

Polecenie wykonane wg rady Pilsner'a coś mi źle działa (nie wiem co to jest: USING).

Jeżeli TO jest proste to niech Ktoś mądry napisze mi jak to skonstruować... Może z tym JOIN(em) ale z tym sobie nie radzę.
Pilsener
Using to skrócona forma zapisu:
  1. JOIN tabela2 USING(login)

  1. JOIN tabela2 ON tabela.login=tabela2.login
- jeśli złączanie jest po tych samych polach.

Iloczynem kartezjańskim i bez podzapytania też da się to zrobić, ale na pewno będzie mniej wydajne (zwłaszcza iloczyn kartezjański dwóch tabel), więc kombinuj raczej z zapytaniem które ja podałem.
Andrzej1002
Niestety w dalszym ciągu najlepiej wychodzi mi moje rozwiązanie (tylko powinna być odwrotna kolejność).
Ćwiczę dalej z JOIN i UNION ale wychodzi mi cały czas nadmiar wyników....
Jasnej podpowiedzi..... czekam. To tylko pozornie jest proste exclamation.gif!!

coś zapewne pomijam w myśleniu. Zrobilem coś z rożnymi JOIN(ami) ale wynik jest zawsze "do gory nogami" czyli w wyniku (i oczywiście po zawężeniu do RAZ powtarzającego się klienta) mam najstarszy wynik, czyli na pierwszy na jaki natrafi w bazie danych czesząc ją od początku do końca. Zdawalo mi się, że jak dodam kolumnę z datą dodania i określę ją wartością DESC to może coś pomóc -- ale nic z tego....

  1. $wynik = mysql_query ("SELECT DISTINCT ta.NrKlienta, ta.Miesiac, ta.Rok, tb.NrKlienta, tb.email, tb.data FROM ta JOIN tb ON ta.NrKlienta = tb.NrKlienta AND ta.Miesiac = '$month' AND tb.Rok ='$year' GROUP BY tb.NrKlienta ORDER BY tb.data DESC; ") or die ("błąd w pytaniu");


otrzymany rezultat znowu jest:

15 -- aaa9999@o2.pl
22 -- aaa1111@o2.pl <----- a powinno być aaa8888@o2.pl
21 -- aaa7777@o2.pl
44 -- aaa5555@o2.pl


to zapewne jest proste ale właśnie to coś prostego mi nie przychodzi do glowy lub tego nie wiem....

Czy ktoś wpadnie na pomysł questionmark.gifquestionmark.gif?
Pilsener
Przecież dostałeś gotowe zapytanie, więc w czym problem? Nie dołącza emaili po nr klienta? Jakoś nie widzę, żebyś próbował go użyć... a u mnie działa idealnie.
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.