[mysql, postgres] poprawne uzycie GROUP BY i JOIN
Cabra - 12-01-2007 00:29
[mysql, postgres] poprawne uzycie GROUP BY i JOIN
Witam,
mam taki problem: sa dwie tabele
dyscypliny(id_dyscyplina, nazwa); zawodnik(id_zawodnik, rok_urodzenia, id_dyscyplina);
i teraz musze wyswietlic wszystkie dyscypliny i srednia wieku ich uczestnikow i nie mam pojecia na ten czas jak policzyc sume lat dla zawodnikow z poszczegolnych dyscyplin ... moze ktos z Was mi pomoze ?
Pozdrawiam, Cabra
Herakles - 12-01-2007 00:29
Cabra wrote:
> Witam, > > mam taki problem: sa dwie tabele > > dyscypliny(id_dyscyplina, nazwa); > zawodnik(id_zawodnik, rok_urodzenia, id_dyscyplina); > > i teraz musze wyswietlic wszystkie dyscypliny i srednia wieku ich > uczestnikow i nie mam pojecia na ten czas jak policzyc sume lat dla > zawodnikow z poszczegolnych dyscyplin ... moze ktos z Was mi pomoze ? > > > Pozdrawiam, > Cabra
Moim skromnym zdaniem popełniony jest tu logiczny błąd w struktórze aplikacji. Jeden zawodnik może uprawiać wiele dyscyplin. Czyli bazka powinna wyglądać tak:
contenders(contenders_id, name,birth_date); branches(branches_id, name); contenders_to_branches(contenders_id,branches_id);
w tym wypadku średnia wieku wyglądac będzie tak:
select avg(c.birth_date) from contenders c inner join contenders_to_branches c2b on c2b.contenders_id=c.contenders_id where c2b.branches_id=76;
A tak wogóle to dobże dobrałem angielszczyznę?
Cabra - 12-01-2007 00:29
Użytkownik "Herakles" <herakles@buziaczek.pl> napisał w wiadomości news:eo4q9j$856$1@atlantis.news.tpi.pl... > Cabra wrote: > >> Witam, >> >> mam taki problem: sa dwie tabele >> >> dyscypliny(id_dyscyplina, nazwa); >> zawodnik(id_zawodnik, rok_urodzenia, id_dyscyplina); >> >> i teraz musze wyswietlic wszystkie dyscypliny i srednia wieku ich >> uczestnikow i nie mam pojecia na ten czas jak policzyc sume lat dla >> zawodnikow z poszczegolnych dyscyplin ... moze ktos z Was mi pomoze ? >> >> >> Pozdrawiam, >> Cabra > > Moim skromnym zdaniem popełniony jest tu logiczny błąd w struktórze > aplikacji. Jeden zawodnik może uprawiać wiele dyscyplin. > Czyli bazka powinna wyglądać tak: > > contenders(contenders_id, name,birth_date); > branches(branches_id, name); > contenders_to_branches(contenders_id,branches_id); > > w tym wypadku średnia wieku wyglądac będzie tak: > > select avg(c.birth_date) from contenders c inner join > contenders_to_branches > c2b on c2b.contenders_id=c.contenders_id where c2b.branches_id=76;
Witam,
jak na moj gust to tabele zrobilem takie same :) i z moich rowniez wynika ze jeden zawodnik moze uprawiac wiele dyscyplin, natomiast co do rozwiazania to podales dla jedej dyscypliny a ja nie wiem jak wyswietlic wszystkie dyscypliny i dla kazdej z nich sredni wiek uprawiajacych ja ludkow.
-- Pozdrawiam, Cabra
Maciek Dobrzanski - 12-01-2007 00:29
"Cabra" <dominik.bereta@gmail.com> wrote in message news:1168500986.202573.51250@i39g2000hsf.googlegro ups.com...
> dyscypliny(id_dyscyplina, nazwa); > zawodnik(id_zawodnik, rok_urodzenia, id_dyscyplina); >
SELECT dsc.id_dyscyplina, YEAR(NOW())-AVG(zwd.rok_urodzenia) AS srednia_wieku FROM dyscypliny dsc JOIN zawodnik zwd ON dsc.id_dyscyplina = zwd.id_dyscyplina GROUP BY (dsc.id_dyscyplina)
Maciek
hubert depesz lubaczewski - 12-01-2007 00:29
On 2007-01-11, Cabra <dominik.bereta@gmail.com> wrote: > dyscypliny(id_dyscyplina, nazwa); > zawodnik(id_zawodnik, rok_urodzenia, id_dyscyplina); > i teraz musze wyswietlic wszystkie dyscypliny i srednia wieku ich > uczestnikow i nie mam pojecia na ten czas jak policzyc sume lat dla > zawodnikow z poszczegolnych dyscyplin ... moze ktos z Was mi pomoze ?
select d.nazwa, avg(z.rok_urodzenia) from dyscypliny d left outer join zawodnik z on d.id_dyscyplina = z.id_dyscyplina group by d.nazwa;
z tym, że to poda ci średni rok urodzenia. ale z tym już powinieneś sobie poradzić.
depesz
-- http://www.depesz.com/ - blog dla ciebie
hubert depesz lubaczewski - 12-01-2007 00:29
On 2007-01-11, Cabra <bereta@plusnet.pl> wrote: > jak na moj gust to tabele zrobilem takie same :) i z moich rowniez wynika ze > jeden zawodnik moze uprawiac wiele dyscyplin, natomiast co do rozwiazania to
nie prawda. na twoich tabelach nie da się zapisać zawodnika w wielu dyscyplinach (zakładając, że na id_zawodnika masz klucz podstawowy, primary key).
depesz
-- http://www.depesz.com/ - blog dla ciebie
Herakles - 12-01-2007 00:29
>> contenders(contenders_id, name,birth_date); >> branches(branches_id, name); >> contenders_to_branches(contenders_id,branches_id);
select b.branches_id, b.name, avg(c.birth_date) from contenders c inner join contenders_to_branches c2b on c2b.contenders_id=c.contenders_id inner join branches b on b.branches_id=c2b.branches.id group by b.branches_id, b.name;
> > > -- > Pozdrawiam, > Cabra
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[mysql] =?ISO-8859-2?Q?Za=E6mienie=2E=2E=2E_jak_wy=B6wietli=E6?==?ISO-8859-2?Q?=2E=2E=2E?=
[mysql] =?ISO-8859-2?Q?wielko=B6=E6_bazy_a_stabilno=B6=E6=2C?==?ISO-8859-2?Q?_podzia=B3_du=BFej_bazy_a_powi=B1zania_tabel?=
[MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?=
[mysql 4.0.x] przenoszenie kolum =?ISO-8859-2?Q?mi=EAdzy_bazam?==?ISO-8859-2?Q?i_cd_=2E=2E=2E_?=
[MySQL] =?ISO-8859-2?Q?z=B3=B1czenie_tabeli_u=BFytkownik_i?==?ISO-8859-2?Q?_zdj=EAcia_z_wyborem_zdj=EAcia_domy=B6lnego?=
[MySQL] Jak =?ISO-8859-2?Q?wpisa=E6_do_tabeli_pozycje_dl?==?ISO-8859-2?Q?a_wierszy_gdybym_te_wiersze_wybiera=B3_w_ok?== ?ISO-8859-2?Q?re=B6lonej_kolejno=B6ci_=3F?=
Gdzie MySQL 4.1, a gdzie 5.0?
[MySQL 4.0...4.1] zabezpieczenie przed =?ISO-8859-2?Q?jednoczesn?==?ISO-8859-2?Q?=B1_edycj=B1?=
[MS SQL] "set names" (mySQL) w MS SQL
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
zanotowane.pldoc.pisz.plpdf.pisz.plets2.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|