Twoje PC  
Zarejestruj się na Twoje PC
TwojePC.pl | PC | Komputery, nowe technologie, recenzje, testy
B O A R D
   » Board
 » Zadaj pytanie
 » Archiwum
 » Szukaj
 » Stylizacja

 
M E N U
  0
 » Nowości
0
 » Archiwum
0
 » Recenzje / Testy
0
 » Board
0
 » Rejestracja
0
0
 
Szukaj @ TwojePC
 

w Newsach i na Boardzie
 
OBECNI NA TPC
 
 » Zibi 03:29
 » Shark20 03:15
 » Piwomir 03:00
 » Visar 02:28
 » GULIwer 02:20
 » elliot_pl 01:06
 » Pinokio.p 01:03
 » ham_solo 00:53
 » Paweł27 00:51
 » Martens 00:45
 » Wedrowiec 00:33
 » slanter 00:17
 » Mademan 00:17
 » Holyboy 00:16
 » piszczyk 00:13
 » resmedia 23:54
 » Tomasz 23:53
 » yanix 23:48
 » g5mark 23:42
 » homzik 23:32

 Dzisiaj przeczytano
 41122 postów,
 wczoraj 25974

 Szybkie ładowanie
 jest:
włączone.

 
ccc
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 :)

  1. r r q q , maciej_s 6/09/10 22:38
    Mastahem nie jestem, ale może w odwrotnej kolejności robić UNION?

    1. 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

      1. 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

        1. 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 :)

  2. 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"

  3. 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

    1. To jakaś debilna baza musi być ;) , pachura 7/09/10 09:02
      ...pewnie MySQL, on takie "ułatwienia" dla programistów posiada...

      1. 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?

        1. 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

          1. ok, dzieki , gorky 7/09/10 17:27
            zaspokoilo to moja ciekawosc ;)

    
All rights reserved ® Copyright and Design 2001-2024, TwojePC.PL