TwojePC.pl © 2001 - 2024
|
|
A R C H I W A L N A W I A D O M O Ś Ć |
|
|
|
Pytanie do masterów rzeźbiarzy SQL'a :) , gorky 6/09/10 21:00 czołem,
mam taki problem:
Przez parę minionych lat organizowałem pewną cykliczną imprezę. Teraz chcę zrobić spotkanie wspomnieniowe dla ludzi, którzy uczestniczyli w co najmniej trzech poprzednich edycjach.
Dane osobowe są w osobnych tabelach SQL, a ja SQLa znam raczej słabo - tzn. wystarczyło do napisania tej bazy, ale nie potrafię z niej wyciągnąć bardziej skomplikowanych rzeczy, na przykład właśnie tego czego szukam.
Robię takie oto zapytanie:
SELECT pesel,contact
FROM (
SELECT pesel,contact FROM members_2006
UNION ALL
SELECT pesel,contact FROM members_2007
UNION ALL
SELECT pesel,contact FROM members_2008
UNION ALL
SELECT pesel,email AS contact FROM members_2009
UNION ALL
SELECT pesel,email AS contact FROM members_2010
)
AS temptable
GROUP BY pesel HAVING (COUNT(pesel)>2)
I prawie, prawie to działa. Prawie, bo ładnie grupuje i zlicza, ale wyniki wypluwa mi z pierwszym mailem jaki wystąpił przy danym peselu - a ja chciałbym z ostatnim, bo sporo osób zmieniło maile między 2006 a 2010.
Da się coś takiego zrobić? A jeszcze lepiej byłoby gdyby wypluwał WSZYSTKIE maile jakich użyła we wszystkich latach do rejestracji osoba o danym peselu, pod warunkiem że pesel ten występuje w co najmniej trzech tabelach (czyli że dana osoba brała udział w co najmniej trzech edycjach imprezy).
Mam nadzieję że nie namieszałem, jakby co to służę wyjaśnieniami :)- r r q q , maciej_s 6/09/10 22:38
Mastahem nie jestem, ale może w odwrotnej kolejności robić UNION?- hehe , gorky 6/09/10 22:50
No wlasnie dlatego zapytalem - czasem czlowiek nie widzi najprostszych rzeczy :)
A przed sekunda udalo mi sie zrobic to co chcialem - wyciagnalem wszystkie maile uzyte kiedykolwiek do rejestracji przez uzytkownikow wystepujacych wiecej niz dwa razy.
Musi to jednak byc paskudnie nieoptymalne zapytanie, bo wszystkie te bazy licza po okolo 200 rekordow kazda, a wykonywalo sie to jakies 25 sekund. Anyway, gdyby ktos kiedys przypadkiem na to trafil, to taki paskudny kawalek kodu spelnil swoja funkcje:
SELECT pesel,contact FROM (
SELECT pesel,contact FROM members_2006
UNION ALL
SELECT pesel,contact FROM members_2007
UNION ALL
SELECT pesel,contact FROM members_2008
UNION ALL
SELECT pesel,email AS contact FROM members_2009
UNION ALL
SELECT pesel,email AS contact FROM members_2010
)
AS temptable1
WHERE pesel IN
(
SELECT pesel
FROM (
SELECT pesel,contact FROM members_2006
UNION ALL
SELECT pesel,contact FROM members_2007
UNION ALL
SELECT pesel,contact FROM members_2008
UNION ALL
SELECT pesel,email AS contact FROM members_2009
UNION ALL
SELECT pesel,email AS contact FROM members_2010
)
AS temptable
GROUP BY pesel HAVING ( COUNT(pesel) >2 ) )
GROUP BY contact
ORDER BY pesel- A wszystkie kłopoty biorą z wysoce niewłaściwej struktury bazy. , Rhobaak 6/09/10 23:34
Ale i tak dobrze, że nie tworzyłeś osobnej tabeli dla każdej osoby;)Kor2dual3,2hZ overkloc,4Gbit Ram
G-forc 460 gietex,barakudy
Children of Neostrada Association MVP - noo, wiesz jak to jest :) , gorky 6/09/10 23:42
te piec lat temu myslalem ze to jest prowizorka na jeden raz, a potem po prostu co roku zmienialem jedna cyferke, no bo w koncu dzialalo ;)
Tak czy inaczej dziękuję wszystkim potencjalnie pomocnym :)
- następną razom , Deus ex machine 6/09/10 23:33
struktury tabel i co chcesz uzyskać, będzie łatwiej. A jak już sobie poradziłeś, to nic tu po mnie .)"Uti non Abuti" - Tak z ciekawości... , JE Jacaw 7/09/10 08:12
...wyciągasz pesel i contact, a grupujesz tylko po pesel i to działa ?Socjalizm to ustrój, który
bohatersko walczy z problemami
nieznanymi w innych ustrojach - To jakaś debilna baza musi być ;) , pachura 7/09/10 09:02
...pewnie MySQL, on takie "ułatwienia" dla programistów posiada...- no mysql :) , gorky 7/09/10 12:12
i tak - dziala :)
ja z bazami prawie nie mam do czynienia, wklepalem kod opierajac sie na intuicji i podpierajac sie googlem, zadzialalo to co sie bede przejmowal :) to bylo jednorazowe zapytanie.
a - tak z ciekawosci - dlaczego nie powinno dzialac?- Z tego co prznajmniej ja wiem... , JE Jacaw 7/09/10 12:24
...to w group by powinno się znajdować przynajmniej wszystko to co jest między select i from, oczywiście z wyjątkiem funkcji agregujących np. sum itd. To tak w skrócie i bez fachowej terminologii. :-)Socjalizm to ustrój, który
bohatersko walczy z problemami
nieznanymi w innych ustrojach - ok, dzieki , gorky 7/09/10 17:27
zaspokoilo to moja ciekawosc ;)
|
|
|
|
|
All rights reserved ® Copyright and Design 2001-2024, TwojePC.PL |
|
|
|
|