Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL]Jak z dwóch tabel wyłuskać dane z najmłodszą datą..., ... i mocno ZAWĘZIĆ wynik bez powtórzeń????
Andrzej1002
post
Post #1





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 12.03.2010

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


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 (IMG:style_emoticons/default/questionmark.gif) (IMG:style_emoticons/default/questionmark.gif) (IMG:style_emoticons/default/questionmark.gif) (IMG:style_emoticons/default/questionmark.gif) (IMG:style_emoticons/default/questionmark.gif) ;")


Jeżeli ktoś podpowie mi prosty SELECT to będzie super...
Go to the top of the page
+Quote Post
Pawel_W
post
Post #2





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

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


  1. SELECT `email` FROM tb ORDER BY `data` GROUP BY `NrKlienta`

nie wiem czy na 100% działa, pisane "z palca" (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
Andrzej1002
post
Post #3





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 12.03.2010

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


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.

Go to the top of the page
+Quote Post
Pawel_W
post
Post #4





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

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


no to co za problem? dostawiasz LEFT JOIN i gotowe (IMG:style_emoticons/default/smile.gif) nie podam ci gotowca bo przecież nie o to chodzi (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Andrzej1002
post
Post #5





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 12.03.2010

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


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 (IMG:style_emoticons/default/questionmark.gif) (IMG:style_emoticons/default/questionmark.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..........
Go to the top of the page
+Quote Post
Pilsener
post
Post #6





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


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.

Go to the top of the page
+Quote Post
Andrzej1002
post
Post #7





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 12.03.2010

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


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ę.
Go to the top of the page
+Quote Post
Pilsener
post
Post #8





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


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.
Go to the top of the page
+Quote Post
Andrzej1002
post
Post #9





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 12.03.2010

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


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 (IMG:style_emoticons/default/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ł (IMG:style_emoticons/default/questionmark.gif) (IMG:style_emoticons/default/questionmark.gif) ?
Go to the top of the page
+Quote Post
Pilsener
post
Post #10





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


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.
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: 14.09.2025 - 20:00