![]() |
![]() ![]() |
![]() |
![]()
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ą...
Jeżeli ktoś podpowie mi prosty SELECT to będzie super... |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 675 Pomógł: 286 Dołączył: 15.06.2009 Skąd: Wieliczka Ostrzeżenie: (0%) ![]() ![]() |
nie wiem czy na 100% działa, pisane "z palca" (IMG:style_emoticons/default/winksmiley.jpg) |
|
|
![]()
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. |
|
|
![]()
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)
|
|
|
![]()
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.......... |
|
|
![]()
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:
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. |
|
|
![]()
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:
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)]:
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ę. |
|
|
![]()
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:
- 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. |
|
|
![]()
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....
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) ? |
|
|
![]()
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.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 14.09.2025 - 20:00 |